Какие основные виды коллекций существуют в C#?

«Какие основные виды коллекций существуют в C#?» — вопрос из категории C# Core, который задают на 47% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Коллекции в C# делятся на обобщённые (System.Collections.Generic) и необобщённые (System.Collections). В современной разработке используются почти исключительно обобщённые коллекции из-за типобезопасности и производительности.

Основные обобщённые коллекции:

  • List<T> — динамический массив. Быстрый доступ по индексу (O(1)), медленная вставка/удаление в середину (O(n)).

    var numbers = new List<int> { 1, 2, 3 };
    numbers.Add(4); // Добавление в конец
    int second = numbers[1]; // Доступ по индексу
  • Dictionary<TKey, TValue> — хеш-таблица. Быстрый доступ, добавление и удаление по ключу (в среднем O(1)). Ключи должны быть уникальными.

    var capitals = new Dictionary<string, string>
    {
        ["France"] = "Paris",
        ["Japan"] = "Tokyo"
    };
    string city = capitals["Japan"]; // Получение по ключу
  • HashSet<T> — коллекция уникальных элементов на основе хеш-таблицы. Оптимизирована для операций проверки принадлежности (Contains), объединения (UnionWith), пересечения (IntersectWith).

    var uniqueNumbers = new HashSet<int> { 1, 2, 2, 3 }; // Результат: {1, 2, 3}
    bool added = uniqueNumbers.Add(2); // Вернёт false, так как 2 уже есть
  • Queue<T> — коллекция по принципу FIFO (First-In-First-Out).

    var queue = new Queue<string>();
    queue.Enqueue("First");
    queue.Enqueue("Second");
    string firstItem = queue.Dequeue(); // Вернёт "First"
  • Stack<T> — коллекция по принципу LIFO (Last-In-First-Out).

    var stack = new Stack<string>();
    stack.Push("First");
    stack.Push("Second");
    string topItem = stack.Pop(); // Вернёт "Second"
  • LinkedList<T> — двусвязный список. Очень быстрая вставка и удаление в любом месте (O(1)), если есть ссылка на узел, но медленный доступ по индексу (O(n)).

Выбор коллекции:

  • Используйте List<T> по умолчанию для простых списков.
  • Используйте Dictionary<TKey, TValue> для быстрого поиска по ключу.
  • Используйте HashSet<T>, когда важна уникальность и быстрая проверка наличия элемента.
  • Необобщённые коллекции (ArrayList, Hashtable) считаются устаревшими и их следует избегать из-за проблем с производительностью (упаковка/распаковка) и типобезопасностью.