Sobes.tech
Junior

Jakie są typy kolekcji w C#?

sobes.tech AI

Odpowiedź od AI

C# oferuje szeroki wybór typów kolekcji do przechowywania i zarządzania danymi, znajdujących się w różnych przestrzeniach nazw (głównie System.Collections, System.Collections.Generic, System.Collections.Concurrent, System.Collections.Immutable). Można je klasyfikować według kilku głównych kryteriów:

  1. Według typu przechowywanych danych:

    • Beztypowe (Untyped): Przechowują obiekty typu object (System.Collections). Wymagają rzutowania typów i mogą być mniej wydajne.
    • Typowane (Generic): Przechowują obiekty określonego typu (System.Collections.Generic). Zapewniają bezpieczeństwo typów i lepszą wydajność.
  2. Według struktury danych:

    • Listy (Lists): Kolekcje sekwencyjne, dostęp do elementów po indeksie.
      • ArrayList (beztypowa)
      • List<T> (typowana)
      • LinkedList<T> (dwukierunkowa lista powiązana typowana)
    • Tablice (Arrays): O stałym rozmiarze, dostęp po indeksie.
      • Array (klasa bazowa)
      • T[] (składnia cukrowa dla tablic)
    • Słowniki (Dictionaries): Kolekcje par klucz-wartość, dostęp po kluczu.
      • Hashtable (beztypowa)
      • Dictionary<TKey, TValue> (typowana)
      • SortedList (beztypowa, posortowana po kluczu)
      • SortedList<TKey, TValue> (typowana, posortowana po kluczu)
      • SortedDictionary<TKey, TValue> (typowana, posortowana po kluczu, używa drzewa czerwono-czarnego)
    • Zbiory (Sets): Kolekcje unikalnych elementów.
      • HashSet<T> (typowany, nieuporządkowany)
      • SortedSet<T> (typowany, uporządkowany)
    • Kolejki (Queues): Kolekcje działające na zasadzie "pierwszy wszedł, pierwszy wyszedł" (FIFO).
      • Queue (beztypowa)
      • Queue<T> (typowana)
    • Stosy (Stacks): Kolekcje działające na zasadzie "ostatni wszedł, pierwszy wyszedł" (LIFO).
      • Stack (beztypowa)
      • Stack<T> (typowana)
  3. Pod względem bezpieczeństwa wątków:

    • Niebezpieczne dla wątków: Większość standardowych kolekcji (System.Collections, System.Collections.Generic). Wymagają zewnętrznej synchronizacji do pracy wielowątkowej.
    • Bezpieczne dla wątków (Concurrent): Zaprojektowane do bezpiecznej pracy w środowisku wielowątkowym bez zewnętrznego blokowania (System.Collections.Concurrent).
      • ConcurrentBag<T>
      • ConcurrentDictionary<TKey, TValue>
      • ConcurrentQueue<T>
      • ConcurrentStack<T>
  4. Pod względem mutowalności:

    • Zmienne (Mutable): Większość kolekcji pozwala na dodawanie, usuwanie i modyfikację elementów.
    • Niezmiennicze (Immutable): Zapewniają niezmienność po utworzeniu (System.Collections.Immutable). Każda operacja modyfikacji zwraca nową kolekcję.
      • ImmutableArray<T>
      • ImmutableList<T>
      • ImmutableDictionary<TKey, TValue>
      • ImmutableHashSet<T>
      • ImmutableSortedSet<T>
      • ImmutableQueue<T>
      • ImmutableStack<T>

Wybór konkretnego typu kolekcji zależy od wymagań zadania: typ danych, konieczność dostępu po indeksie lub kluczu, wymogi dotyczące unikalności elementów, kolejność przechowywania, wydajność, bezpieczeństwo wątków i mutowalność. Obecnie najczęściej używanymi w C# są kolekcje typowane z przestrzeni nazw System.Collections.Generic.