Какова наиболее эффективная (с точки зрения скорости) реализация коллекций UniqueQueue и UniqueReplacementQueue в .NET, учитывая тот факт, что скорость операций Enqueue и Dequeue одинаково важна.
UniqueQueue - очередь, в которой дублируютсяне возможно.Поэтому, если я помещаю элемент в очередь, он добавляется только в том случае, если он еще не существует в очереди.
UniqueReplacementQueue - это очередь, в которой дублирование также невозможно.Разница в том, что если я нажимаю элемент, который уже существует в очереди, он заменяет существующий элемент в той же позиции.Это имеет смысл для ссылочных типов.
Моя текущая реализация UniqueQueue и UniqueReplacementQueue:
sealed class UniqueQueue<T> : IQueue<T>
{
readonly LinkedList<T> list;
readonly IDictionary<T, int> dictionary;
public UniqueQueue(LinkedList<T> list, IDictionary<T, int> dictionary)
{
this.list = list;
this.dictionary = dictionary;
}
public int Length
{
get { return list.Count; }
}
public T Dequeue()
{
if (list.Count == 0)
{
throw new InvalidOperationException("The queue is empty");
}
var element = list.First.Value;
dictionary.Remove(element);
list.RemoveFirst();
return element;
}
public void Enqueue(T element)
{
dictionary[element] = 0;
if (dictionary.Count > list.Count)
{
list.AddLast(element);
}
}
}
sealed class UniqueReplacementQueue<T> : IQueue<T>
{
readonly LinkedList<T> list;
readonly IDictionary<T, T> dictionary;
public UniqueReplacementQueue(LinkedList<T> list, IDictionary<T, T> dictionary)
{
this.list = list;
this.dictionary = dictionary;
}
public int Length
{
get { return list.Count; }
}
public T Dequeue()
{
if (list.Count == 0)
{
throw new InvalidOperationException("The queue is empty");
}
var element = dictionary[list.First.Value];
dictionary.Remove(element);
list.RemoveFirst();
return element;
}
public void Enqueue(T element)
{
dictionary[element] = element;
if (dictionary.Count > list.Count)
{
list.AddLast(element);
}
}
}