Collections (Колекции)
Колекциите в C# позволяват работа с множества от обекти. Всеки тип колекция има специфични характеристики и приложения.
List<T>
Динамичен масив, който може да расте и да се свива автоматично.
List<string> names = new List<string>();
names.Add("John");
names.Add("Jane");
names.Remove("John");
bool contains = names.Contains("Jane"); // true
string first = names[0]; // Индексиране
Dictionary<TKey, TValue>
Колекция от двойки ключ-стойност.
Dictionary<string, int> ages = new Dictionary<string, int>();
ages.Add("John", 25);
ages["Jane"] = 30; // Алтернативен синтаксис
int johnsAge = ages["John"];
bool exists = ages.ContainsKey("Jane");
HashSet<T>
Колекция от уникални елементи с бързо търсене.
HashSet<int> numbers = new HashSet<int>();
numbers.Add(1);
numbers.Add(2);
numbers.Add(1); // Игнорира се (вече съществува)
bool contains = numbers.Contains(1); // O(1) операция
Queue<T>
Опашка (FIFO - First In First Out).
Queue<string> queue = new Queue<string>();
queue.Enqueue("First");
queue.Enqueue("Second");
string first = queue.Dequeue(); // "First"
string peek = queue.Peek(); // Поглежда първия елемент без да го премахва
Stack<T>
Стек (LIFO - Last In First Out).
Stack<int> stack = new Stack<int>();
stack.Push(1);
stack.Push(2);
int last = stack.Pop(); // 2
int peek = stack.Peek(); // Поглежда последния елемент
LinkedList<T>
Двусвързан списък.
LinkedList<string> linked = new LinkedList<string>();
linked.AddFirst("First");
linked.AddLast("Last");
LinkedListNode<string> node = linked.First;
string value = node.Value;
SortedDictionary<TKey, TValue>
Речник, сортиран по ключ.
SortedDictionary<string, int> sorted = new SortedDictionary<string, int>();
sorted.Add("C", 3);
sorted.Add("A", 1);
sorted.Add("B", 2);
// Ключовете ще бъдат в азбучен ред: A, B, C
ConcurrentDictionary<TKey, TValue>
Thread-safe речник за многонишкови приложения.
ConcurrentDictionary<string, int> concurrent = new ConcurrentDictionary<string, int>();
concurrent.TryAdd("key", 1);
concurrent.AddOrUpdate("key", 1, (key, oldValue) => oldValue + 1);
int value;
bool success = concurrent.TryGetValue("key", out value);
ObservableCollection<T>
Колекция, която известява за промени (често използвана в WPF).
ObservableCollection<string> items = new ObservableCollection<string>();
items.CollectionChanged += (s, e) =>
{
Console.WriteLine("Collection changed!");
};
items.Add("New Item");
ImmutableList<T>
Непроменяема колекция.
ImmutableList<int> immutable = ImmutableList.Create<int>();
immutable = immutable.Add(1); // Създава нова колекция
immutable = immutable.AddRange(new[] { 2, 3, 4 });
Производителност
| Колекция | Add/Remove | Search | Memory |
|---|---|---|---|
| List | O(1)/O(n) | O(n) | Ниска |
| Dictionary | O(1) | O(1) | Средна |
| HashSet | O(1) | O(1) | Средна |
| LinkedList | O(1) | O(n) | Висока |
| SortedDict | O(log n) | O(log n) | Средна |
ConcurrentDictionary<TKey, TValue>
ConcurrentDictionary<TKey, TValue> е речник, който може да бъде използван в многонишкови приложения. Той е безопасен за многонишки и може да бъде използван в многонишкови приложения.
Създаване на ConcurrentDictionary<TKey, TValue>
ConcurrentDictionary<string, int> dictionary = new ConcurrentDictionary<string, int>();
Добавяне на елементи
dictionary.TryAdd("one", 1);
dictionary.TryAdd("two", 2);
dictionary.TryAdd("three", 3);
Изтриване на елементи
dictionary.TryRemove("two", out int value);
Проверка за наличност на ключ
bool containsKey = dictionary.ContainsKey("one");