Sobes.tech
Junior

Какви видове колекции съществуват в C#?

sobes.tech AI

Отговор от AI

C# предлага множество типове колекции за съхранение и управление на данни, разположени в различни пространства от имена (главно System.Collections, System.Collections.Generic, System.Collections.Concurrent, System.Collections.Immutable). Те могат да бъдат класифицирани по няколко основни признака:

  1. По типа на съхраняваните данни:

    • Безтипови (Untyped): Съхраняват обекти от тип object (System.Collections). Изискват преобразуване на типове и могат да бъдат по-малко ефективни.
    • Типизирани (Generic): Съхраняват обекти от определен тип (System.Collections.Generic). Осигуряват безопасност на типовете и по-добра производителност.
  2. По структура на данните:

    • Списъци (Lists): Последователни колекции, достъп до елементите по индекс.
      • ArrayList (безтипов)
      • List<T> (типизиран)
      • LinkedList<T> (типизиран, двусвързан списък)
    • Масиви (Arrays): Фиксиран размер, достъп по индекс.
      • Array (базов клас)
      • T[] (синтактичен захар за масиви)
    • Речници (Dictionaries): Колекции от двойки ключ-стойност, достъп по ключ.
      • Hashtable (безтипов)
      • Dictionary<TKey, TValue> (типизиран)
      • SortedList (безтипов, сортиран по ключ)
      • SortedList<TKey, TValue> (типизиран, сортиран по ключ)
      • SortedDictionary<TKey, TValue> (типизиран, сортиран по ключ, използва червено-черно дърво)
    • Множества (Sets): Колекции от уникални елементи.
      • HashSet<T> (типизиран, несортиран)
      • SortedSet<T> (типизиран, сортиран)
    • Опашки (Queues): Колекции, работещи по принципа "първи дошъл, първи излязъл" (FIFO).
      • Queue (безтипов)
      • Queue<T> (типизиран)
    • Стекове (Stacks): Колекции, работещи по принципа "последен дошъл, първи излязъл" (LIFO).
      • Stack (безтипов)
      • Stack<T> (типизиран)
  3. По безопасност при работа с нишки:

    • Несигурни за нишки: Повечето стандартни колекции (System.Collections, System.Collections.Generic). Изискват външна синхронизация за многонитова работа.
    • Безопасни за нишки (Concurrent): Проектирани за безопасна работа в многонитова среда без външно заключване (System.Collections.Concurrent).
      • ConcurrentBag<T>
      • ConcurrentDictionary<TKey, TValue>
      • ConcurrentQueue<T>
      • ConcurrentStack<T>
  4. По изменяемост:

    • Променяеми (Mutable): Повечето колекции позволяват добавяне, изтриване и промяна на елементи.
    • Непроменяеми (Immutable): Осигуряват неизменност след създаване (System.Collections.Immutable). Всяка операция по промяна връща нова колекция.
      • ImmutableArray<T>
      • ImmutableList<T>
      • ImmutableDictionary<TKey, TValue>
      • ImmutableHashSet<T>
      • ImmutableSortedSet<T>
      • ImmutableQueue<T>
      • ImmutableStack<T>

Изборът на конкретен тип колекция зависи от изискванията на задачата: тип данни, необходимост от достъп по индекс или ключ, изисквания за уникалност на елементите, ред на съхранение, производителност, безопасност при работа с нишки и изменяемост. В съвременния C# най-често използваните са типизираните колекции от пространството от имена System.Collections.Generic.