Лого на 91. НЕГ „Проф. Константин Гълъбов“

Модул 1 · Урок 10

Колекции — List и Dictionary

Динамични структури: List<T> за поредици с променлив размер и Dictionary<TKey, TValue> за ключ → стойност.

Защо ни трябват колекции

Масивът има фиксиран размер — трябва да го знаеш предварително. В реалния свид често не знаем колко елемента ще има (списък ученици в клас, история на действията на потребителя, кошница с покупки). За такива случаи 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
ДължинаLengthCount
Скорост на достъп по индексНай-бързаПочти същата

Когато не знаеш броя предварително — 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, преди да четеш по ключ, който може да липсва.