← Назад к вопросам

Что такое коллекции в C#?

1.0 Junior🔥 111 комментариев
#Основы C# и .NET

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое коллекции в C#?

В C# коллекции — это специализированные классы и структуры, предназначенные для хранения, управления и обработки групп связанных объектов. Они предоставляют готовые реализации распространённых структур данных, что избавляет разработчика от необходимости создавать их с нуля. Коллекции являются фундаментальной частью библиотеки базовых классов .NET (BCL) и играют ключевую роль в построении эффективных и масштабируемых приложений.

Основные характеристики коллекций

Коллекции в C# обладают следующими ключевыми особенностями:

  • Динамическое изменение размера: В отличие от массивов, большинство коллекций могут автоматически увеличивать или уменьшать свою ёмкость по мере добавления или удаления элементов.
  • Разнообразие структур данных: Предлагают различные модели организации данных (списки, словари, множества, очереди, стеки), каждая из которых оптимизирована для определённых сценариев использования.
  • Типизация: Современные коллекции в .NET являются обобщёнными (generic), что обеспечивает безопасность типов на этапе компиляции и исключает необходимость приведения типов (boxing/unboxing для значимых типов).
  • Стандартизированные интерфейсы: Реализуют единые интерфейсы (IEnumerable<T>, ICollection<T>, IList<T>, IDictionary<TKey, TValue>), что обеспечивает согласованность API и возможность полиморфной работы с разными коллекциями.

Иерархия и основные типы коллекций

Пространство имён System.Collections.Generic содержит наиболее часто используемые обобщённые коллекции. Их можно классифицировать по назначению:

1. Списковые коллекции (Lists)

Хранят элементы в виде последовательности, доступной по индексу.

  • List<T>: Универсальный динамический массив. Обеспечивает быстрый доступ по индексу (O(1)) и эффективное добавление в конец (амортизированное O(1)).
    List<string> cities = new List<string>() { "Москва", "Санкт-Петербург" };
    cities.Add("Казань"); // Добавление
    string city = cities[1]; // Доступ по индексу: "Санкт-Петербург"
    cities.Insert(1, "Новосибирск"); // Вставка по индексу
    

2. Ассоциативные коллекции (Словари - Dictionaries)

Хранят пары "ключ-значение", обеспечивая очень быстрый поиск значения по ключу.

  • Dictionary<TKey, TValue>: Реализует хеш-таблицу. Обеспечивает близкое к O(1) время поиска, добавления и удаления. Ключи должны быть уникальными.
    Dictionary<int, string> employees = new Dictionary<int, string>();
    employees.Add(101, "Иванов А.А.");
    employees[102] = "Петрова Б.Б."; // Другой способ добавления/изменения
    string name = employees[101]; // Поиск по ключу: "Иванов А.А."
    

3. Множества (Sets)

Предназначены для хранения уникальных элементов и выполнения математических операций над множествами.

  • HashSet<T>: Хранит уникальные элементы на основе хеш-таблицы. Операции проверки принадлежности (Contains) выполняются за O(1).
    HashSet<int> numbers = new HashSet<int> { 1, 2, 3, 3, 4 }; // {1, 2, 3, 4}
    bool added = numbers.Add(5); // true
    added = numbers.Add(2); // false, элемент уже существует
    

4. Коллекции с определённым порядком обработки

  • Queue<T>: Очередь (FIFO - First In, First Out).
    Queue<string> tasks = new Queue<string>();
    tasks.Enqueue("Задача 1");
    tasks.Enqueue("Задача 2");
    string nextTask = tasks.Dequeue(); // Извлечёт "Задача 1"
    
  • Stack<T>: Стек (LIFO - Last In, First Out).
    Stack<string> browserHistory = new Stack<string>();
    browserHistory.Push("Главная");
    browserHistory.Push("Новости");
    string previousPage = browserHistory.Pop(); // Извлечёт "Новости"
    

IEnumerable<T> и итерация

Фундаментальным интерфейсом для всех коллекций является IEnumerable<T>. Он определяет метод GetEnumerator(), позволяющий выполнять итерацию по элементам коллекции с помощью цикла foreach.

foreach (var employee in employees.Values)
{
    Console.WriteLine(employee);
}

Потокобезопасные коллекции

Для многопоточных сценариев в пространстве имён System.Collections.Concurrent представлены специальные коллекции (ConcurrentDictionary<TKey, TValue>, ConcurrentQueue<T>, ConcurrentBag<T> и др.), которые обеспечивают безопасный доступ из нескольких потоков без необходимости явной блокировки (lock).

Критерии выбора коллекции

  • List<T>: Когда нужен частый доступ по индексу и порядок элементов важен.
  • Dictionary<TKey, TValue>: Когда необходим быстрый поиск элемента по уникальному ключу.
  • HashSet<T>: Когда важна уникальность элементов и быстрая проверка их наличия в коллекции.
  • Queue<T> / Stack<T>: Когда требуется определённая дисциплина обслуживания (FIFO или LIFO).

Заключение

Коллекции в C# — это мощный и гибкий инструмент, который абстрагирует сложность реализации структур данных. Правильный выбор типа коллекции напрямую влияет на производительность, читаемость и поддерживаемость кода. Понимание особенностей каждой из них (сложности операций, поведения при многопоточном доступе, потребления памяти) является обязательным навыком для профессионального C#-разработчика. Использование обобщённых коллекций (System.Collections.Generic) является стандартом де-факто, в то время как устаревшие необобщённые версии (System.Collections) следует применять только для совместимости с унаследованным кодом.