Как мне реализовать QueueDictionary, комбинацию Queue и Dictionary на C #?

В основном структура данных, которую я хочу, будет отражать MSMQ, но будет в памяти, потому что она используется в одном процессе. Под зеркальным отображением MSMQ я имею в виду, что вы ставите объекты в очередь, а затем вы можете либо удалять объекты из очереди, либо извлекать их с помощью ключа. Вот моя первая попытка. Моя основная проблема с этой попыткой заключается в том, что Get by id будет использоваться часто, и поэтому в очереди будет много «мертвых» объектов.

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);
        }
    }
}
6
задан Tim Carter 19 October 2010 в 06:48
поделиться