Самый быстрый и эффективный тип коллекции в 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, нет никаких накладных расходов в боксе/распаковке в его операциях, что делает его намного быстрее.