Прескочи до съдържанието
Редактирай

Collections

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/RemoveSearchMemory
ListO(1)/O(n)O(n)Ниска
DictionaryO(1)O(1)Средна
HashSetO(1)O(1)Средна
LinkedListO(1)O(n)Висока
SortedDictO(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");