**Все типы коллекции, которые доступны в 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` полезен в сценариях, где важна параллельная обработка данных.