Самый быстрый и эффективный тип коллекции в C#
Я создаю приложение, которое потребует коллекции для хранения около 10k строк.
коллекция будет использоваться как очередь.
Так просматривал различные типы коллекций в C#, но не мог понять, какой из них имеет лучшую производительность в отношении скорости выполнения операции Put и Get в очереди. Также должен быть способен не допускать дубликатов в очереди / коллекции.
редактировать на основе комментариев..
любые существующие коллекция будет полезна. Или пользовательская коллекция, которая может выполнять любую существующую коллекцию, будет отличной.
спасибо
3 ответов
есть OrderedDictionary класс, который сохраняет порядок вставки, но позволяет искать значения по ключу.
Если вы ищете высокую производительность Put & Get при проверке на уникальность (повторяющаяся проверка) , но порядок не имеет значения (не очередь), затем используйте HashSet<T>
Если функция очереди более важна, используйте Queue<T>
Я не думаю, что есть что-то, что предлагает оба.
вы не против потратить o (2n) память? Вы можете использовать Queue в сочетании со словарем. Очередь будет обрабатывать операции queue и dequeue, а словарь обеспечит уникальные записи. Простой класс-оболочка может объединить эти два, и это даст вам o (log n) queue и dequeue раз.
пример:
public class SetQueue<T>
{
private readonly Dictionary<T, bool> duplicates = new Dictionary<T, bool>();
private readonly Queue<T> queue = new Queue<T>();
public bool Enqueue(T item)
{
if (!duplicates.ContainsKey(item))
{
duplicates[item] = true;
queue.Enqueue(item);
return true;
}
return false;
}
public T Dequeue()
{
if (queue.Count >0)
{
var item = queue.Dequeue();
if (!duplicates.ContainsKey(item))
throw new InvalidOperationException("The dictionary should have contained an item");
else
duplicates.Remove(item);
return item;
}
throw new InvalidOperationException("Can't dequeue on an empty queue.");
}
}
вставка в эту пользовательскую структуру данных проверьте, содержит ли словарь уже элемент. Эта операция использует ContainsKey метод, который является операцией O(log n). Если элемент уже содержался в структуре данных, то метод завершает работу. Если элемент не содержится, то элемент будет вставлен в очередь, которая является постоянной операцией O(1). Он также будет добавлен в словарь. Когда количество словаря меньше емкости, это будет приближаться к константе, O (1) Время вставки, а также. Таким образом, общее время очереди будет O(log n).
то же самое происходит в очереди метод.
это решение в основном такое же, как встроенная структура данных OrderedDictionary, однако, поскольку это решение использует generic, нет никаких накладных расходов в боксе/распаковке в его операциях, что делает его намного быстрее.