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:
-
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ść.
- Beztypowe (Untyped): Przechowują obiekty typu
-
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)
- Listy (Lists): Kolekcje sekwencyjne, dostęp do elementów po indeksie.
-
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>
- Niebezpieczne dla wątków: Większość standardowych kolekcji (
-
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.