Fondamentalmente la struttura dati che vorrei rispecchierebbe un MSMQ ma sarebbe in memoria, perché viene utilizzata in un unico processo. Mediante il mirroring di MSMQ, intendo che si accoderebbe gli oggetti, quindi è possibile rimuovere o deselezionare gli oggetti o recuperarli utilizzando una chiave. Ecco il primo tentativo. Il mio problema principale con questo tentativo è che Get by id verrebbe usato frequentemente e quindi la coda finirebbe per avere un sacco di oggetti "morti".Come implementare un QueueDictionary, una combinazione di coda e dizionario in C#?
public class QueueDictionary<TKey, TValue>
{
private readonly Queue _queue = new Queue();
private readonly Dictionary<TKey, TValue> _dictionary = new Dictionary<TKey, TValue>();
private readonly object _syncRoot = new object();
public TValue Dequeue()
{
lock (_syncRoot)
{
TKey key = (TKey)_queue.Dequeue();
while (!_dictionary.ContainsKey(key))
key = (TKey)_queue.Dequeue();
return _dictionary[key];
}
}
public TValue Get(TKey key)
{
lock (_syncRoot)
{
TValue result = _dictionary[key];
_dictionary.Remove(key);
return result;
}
}
public void Enqueue(TKey key, TValue value)
{
lock (_syncRoot)
{
_dictionary.Add(key, value);
_queue.Enqueue(key);
}
}
}
"la coda finirebbe per avere un sacco di oggetti" morti "in esso" - quindi non sarebbe molto di una coda .... –
Perché dovresti ottenere oggetti "morti"? Non sembra * rimuovere * qualsiasi cosa in 'Get' ... E se non stai barando * that *, non sembra che tu abbia bisogno del ciclo 'while' ... che dovrebbe probabilmente proteggersi da una coda vuota. –
@Marc - Penso che il metodo Get sia quello che l'OP chiede aiuto poiché non è possibile rimuovere un oggetto arbitrario dalla coda. – Josh