**Все типы коллекции, которые доступны в C#** Ниже представлено приблизительное распределение основных коллекций по частоте их использования: ### Словари - **[[Dictionary<TKey, TValue> (Словарь)|Dictionary<TKey, TValue>]]**: Словарь, в котором каждому уникальному ключу соответствует значение. Это позволяет быстро найти значение, зная ключ. Dictionary<TKey, TValue> хорошо подходит для случаев, когда вам нужно быстро поискать элементы. - **[[OrderedDictionary]]**: Словарь, который сохраняет порядок вставки элементов. OrderedDictionary полезен, когда вам нужно хранить элементы в порядке их добавления. - **`SortedDictionary<TKey, TValue>`**: Вариант словаря, в котором элементы автоматически сортируются по ключам. SortedDictionary\<TKey, TValue> полезен, когда вам нужно хранить пары ключ-значение в отсортированном виде. - **`ConcurrentDictionary<TKey, TValue>`**: Версия словаря, спроектированная для безопасного использования в многопоточном коде. Если вам нужно использовать словарь в многопоточном окружении, ConcurrentDictionary<TKey, TValue> может быть хорошим выбором. - **`SortedDictionary<TKey, TValue>`**: Словарь, который автоматически сортирует элементы по ключам. SortedDictionary<TKey, TValue> полезен, когда вам нужно хранить пары ключ-значение в отсортированном виде. - **`ReadOnlyDictionary<TKey, TValue>`**: Версия словаря, которая не позволяет модификации после инициализации. Это полезно, когда вы хотите предоставить доступ к словарю для чтения, не позволяя его изменять. - **`StringDictionary`**: Словарь, где ключи и значения являются строками. StringDictionary полезен в сценариях, где все ключи и значения являются строками. - **`HybridDictionary`**: Словарь, который работает как список при малом количестве элементов и переключается на словарь при увеличении числа элементов. HybridDictionary полезен в сценариях, где количество элементов может значительно варьироваться. - **`ObservableDictionary<TKey, TValue>`**: Вариант словаря, который генерирует уведомления при изменении его содержимого. ObservableDictionary<TKey, TValue> полезен в сценариях, где важно отслеживать изменения словаря. ### Комбинация словаря и списка - **`SortedList<TKey, TValue>`**: Коллекция, которая действует как комбинация словаря и списка, автоматически сортируя элементы по ключам. SortedList<TKey, TValue> полезен, когда вам нужно хранить пары ключ-значение в отсортированном виде и иметь возможность итерировать их. ### Прочее 1. **[[List<T> (Список)|List<T>]]**: Динамический массив, который может изменять свой размер и хранить объекты любого типа. Предоставляет методы для добавления, удаления и поиска элементов. `List<T>` поддерживает индексированный доступ, что позволяет быстро получить элемент по индексу. 3. **`Array`**: Статический массив, содержащий элементы одного типа. Размер массива определяется при его создании и не может быть изменен. Массивы обычно используются, когда число элементов известно заранее. 4. **[[HashSet<T> (Множество)|HashSet<T>]]**: Коллекция, которая содержит только уникальные элементы. `HashSet<T>` обеспечивает высокую скорость операций добавления, удаления и проверки принадлежности, что делает его полезным для работы с большими наборами данных. 5. **`Queue<T>`**: Коллекция, которая работает по принципу "первый вошел, первый вышел" (FIFO). Это означает, что элемент, который был добавлен первым, будет первым удален. Очереди обычно используются в сценариях, где важен порядок обработки элементов. 6. **`Stack<T>`**: Коллекция, работающая по принципу "последний вошел, первый вышел" (LIFO). Это означает, что последний добавленный элемент будет первым удален. Стеки полезны в сценариях, где важен порядок обработки элементов. 7. **[[LinkedList<T>]]**: Двусвязный список, в котором каждый элемент хранит ссылки на предыдущий и следующий элементы. `LinkedList<T>` позволяет быстро добавлять и удалять элементы, но доступ к элементу по индексу медленнее, чем в `List<T>`. 9. **`SortedSet<T>`**: Множество, которое автоматически сортирует свои элементы. `SortedSet<T>` полезно, когда вам нужно хранить уникальные элементы в отсортированном виде. 11. **`ObservableCollection<T>`**: Коллекция, которая генерирует события при добавлении или удалении элементов. `ObservableCollection<T>` обычно используется в разработке приложений с пользовательским интерфейсом для связывания данных. 12. **`ConcurrentQueue<T>`**: Версия очереди, спроектированная для безопасного использования в многопоточном коде. Если вам нужно использовать очередь в многопоточном окружении, `ConcurrentQueue<T>` может быть хорошим выбором. 13. **`ConcurrentStack<T>`**: Версия стека, спроектированная для безопасного использования в многопоточном коде. Если вам нужно использовать стек в многопоточном окружении, `ConcurrentStack<T>` может быть хорошим выбором. Минусом является то, что при добавлении элемента через метод `Add` в коллекцию происходит аллокация памяти в куче. 1. **`ReadOnlyCollection<T>`**: Обертка для других коллекций, которая предотвращает любые модификации. `ReadOnlyCollection<T>` полезна, когда вы хотите предоставить доступ к коллекции для чтения, не позволяя изменять ее. 2. **`ConcurrentBag<T>`**: Потокобезопасная коллекция, которую можно использовать для добавления и извлечения элементов без определенного порядка. Он подходит для сценариев, где порядок элементов не важен, но важна потокобезопасность. 3. **`BlockingCollection<T>`**: Потокобезопасная коллекция, которая блокирует поток при попытке извлечь элемент, если коллекция пуста. `BlockingCollection<T>` полезна в сценариях, где производители и потребители работают с разной скоростью. 4. **`ImmutableList<T>`, `ImmutableArray<T>`, `ImmutableDictionary<TKey, TValue>`, `ImmutableHashSet<T>`, `ImmutableQueue<T>`, `ImmutableStack<T>`, `ImmutableSortedSet<T>`, `ImmutableSortedDictionary<TKey, TValue>`**: Это неизменяемые версии обычных коллекций. Они не могут быть изменены после инициализации. Если нужно внести изменения, создается новый экземпляр коллекции с учетом этих изменений. 5. **`Collection<T>`**: Общий класс коллекции, который может быть удобен для создания своих собственных коллекций. `Collection<T>` может быть наследован для создания специализированной коллекции, которая имеет дополнительные методы или свойства. 6. **`KeyedCollection<TKey, TItem>`**: Коллекция, которая содержит ключ для каждого элемента. `KeyedCollection<TKey, TItem>` полезна в сценариях, где каждый элемент имеет уникальный ключ и этот ключ используется для быстрого поиска элементов. 7. **`BitVector32`**: Простая структура, которая хранит булевы значения или небольшие целые числа в 32 битах. `BitVector32` полезен в сценариях, где нужно экономить память и управлять небольшим количеством булевых значений или маленьких целых чисел. 8. **`StringCollection`**: Специальная коллекция, предназначенная для хранения строк. `StringCollection` полезна в сценариях, где все элементы являются строками. 29. **`NameValueCollection`**: Словарь, который хранит пары ключ-значение, где ключом является строка, а значениями - коллекции строк. `NameValueCollection` полезен в сценариях, где каждому ключу соответствует несколько значений. 30. **`System.Collections.Specialized.NameObjectCollectionBase`**: Этот абстрактный базовый класс предоставляет функциональность, которая изначально была предназначена для коллекций, использующих строку в качестве ключа. 31. **`System.Collections.ObjectModel.KeyedCollection`**: Эта коллекция представляет собой словарь, встроенный в коллекцию. `System.Collections.ObjectModel.KeyedCollection` полезен в сценариях, где важно быстро найти элемент по его ключу и при этом сохранить порядок элементов. 32. **`System.Collections.Concurrent.BlockingCollection`**: Эта коллекция используется, когда производство и потребление элементов может происходить в разное время, она блокирует поток, если коллекция пуста. 33. **`System.Collections.Concurrent.Partitioner`**: Этот класс используется для создания диапазонов и частей, которые можно параллельно обрабатывать и итерировать. `System.Collections.Concurrent.Partitioner` полезен в сценариях, где важна параллельная обработка данных.