Защо ни трябват колекции
Масивът има фиксиран размер — трябва да го знаеш предварително. В реалния свид често не знаем колко елемента ще има (списък ученици в клас, история на действията на потребителя, кошница с покупки). За такива случаи C# има колекции в пространството System.Collections.Generic.
List<T> — динамичен масив
using System.Collections.Generic;
List<int> grades = new List<int>();
grades.Add(6);
grades.Add(5);
grades.Add(4);
Console.WriteLine(grades.Count); // 3
Console.WriteLine(grades[0]); // 6
grades.Remove(5); // маха ПЪРВОТО срещане на 5
grades.RemoveAt(0); // маха по индекс
bool has = grades.Contains(4); // true
// Може и веднага със стойности:
List<string> names = new List<string> { "Ани", "Боян", "Вики" };
// Обхождане — точно като масив:
foreach (var name in names)
Console.WriteLine(name);| Масив int[] | List<int> | |
|---|---|---|
| Размер | Фиксиран при създаване | Расте динамично |
| Добавяне на елемент | Не може | Add(...) |
| Премахване | Не може | Remove / RemoveAt |
| Дължина | Length | Count |
| Скорост на достъп по индекс | Най-бърза | Почти същата |
Когато не знаеш броя предварително — List
Ако броят елементи се определя по време на изпълнение (или ще се променя), List<T> е почти винаги правилният избор.
Dictionary<TKey, TValue> — ключ → стойност
Като речник: за всеки ключ пазиш една стойност. Извличането по ключ е практически мигновено, дори при милиони записи.
var ages = new Dictionary<string, int>();
ages["Иван"] = 17;
ages["Мария"] = 16;
ages["Петър"] = 18;
Console.WriteLine(ages["Мария"]); // 16
Console.WriteLine(ages.Count); // 3
bool has = ages.ContainsKey("Иван"); // true
// Безопасен достъп:
if (ages.TryGetValue("Георги", out int g))
Console.WriteLine(g);
else
Console.WriteLine("Няма такъв");
// Обхождане
foreach (var pair in ages)
{
Console.WriteLine($"{pair.Key} → {pair.Value}");
}Внимание
Ключовете са уникални. Ако вече има "Иван" и направишages["Иван"] = 20 — старата стойност се заменя.
HashSet<T> — множество без повторения
Когато ти трябва само „има ли този елемент", без значение колко пъти:
var visited = new HashSet<string>();
visited.Add("page1");
visited.Add("page2");
visited.Add("page1"); // повторение — игнорира се
Console.WriteLine(visited.Count); // 2
Console.WriteLine(visited.Contains("page1")); // trueТипична задача: брояч на думи
string text = "коте мишка коте куче мишка коте";
string[] words = text.Split(' ');
var counts = new Dictionary<string, int>();
foreach (string w in words)
{
if (!counts.ContainsKey(w))
counts[w] = 0;
counts[w]++;
}
foreach (var pair in counts)
Console.WriteLine($"{pair.Key}: {pair.Value}");
// коте: 3
// мишка: 2
// куче: 1Какво трябва да запомниш
List<T>— динамичен масив. Дължина:Count. Добавяне:Add.Dictionary<K, V>— бърз достъп по ключ. Ключовете са уникални.HashSet<T>— множество без повторения.- Винаги ползвай
TryGetValue/ContainsKey, преди да четеш по ключ, който може да липсва.