1. Giriş
Düzünü desək, massivlər — əla şeydir, amma onların limitləri var. Ölçüsünü dəyişmək lazımdır? Yeni massiv yaratmalı və elementləri əllə köçürməlisən! Elementi açar ilə tez tapmaq lazımdır? Massiv deyəcək: "Bunu özün elə, görüm necə alınır".
Real həyat ssenarilərlə doludur ki, orda massivlər əlverişli deyil. Təsəvvür elə, kitabxana üçün kitabların uçotu app-i yazırsan (salam, bizim tədris mini-sistemimiz!). Əvvəlcə səndə 5 kitab var — massiv bəs edir. Bir həftə sonra artıq 500 kitab olur, bir ay sonra kimsə kitabı qaytarır, kimsə itirir... Bax, burada köməyə kolleksiyalar gəlir!
Kolleksiyalar — elə konteynerlərdir ki, bunlar bacarır:
- Ölçüsünü avtomatik dəyişmək.
- Tez axtarış, əlavə və silmə təmin etmək.
- Dataları daha rahat işləmək: sortlama, filterləmə, qrup şəklində işləmə.
.NET-də bir neçə əsas "ailə" kolleksiya var. Bu gün əsasları ilə tanış olacağıq: listlər (List<T>), dictionary-lər (Dictionary<TKey, TValue>), set-lər (HashSet<T>), queue-lar, stack-lər və onların əsasındakı interfeyslərlə.
2. Əsas kolleksiya növləri
Hələ generic kolleksiya tiplərinə dərindən getməmişik, amma vacibdir ki, əsas kateqoriyaları və onların hansı tapşırıqlara uyğun olduğunu başa düşəsən. Bunu müxtəlif "konteyner" növləri kimi düşün, hərəsinin öz özəlliyi var:
Listlər (Lists)
Nədir? Elementlərin ardıcıl sırası. Elə alış-veriş siyahısı və ya jurnalda tələbə siyahısı kimi.
Əsas özəlliklər: Elementlərin sırası var (indeks ilə əldə etmək olur, massiv kimi). Təkrarlanan elementlər ola bilər. Ölçü dinamikdir.
Nə vaxt istifadə etməli? Elementlərin sırası vacibdirsə və sona tez əlavə/silmək və ya elementləri mövqeyə görə əldə etmək istəyirsənsə.
Həyatdan nümunə: Kassa növbəsi, vebinar iştirakçıları siyahısı, animasiyada kadr ardıcıllığı.
Dictionary-lər/Map-lar (Dictionaries/Maps)
Nədir? "Açar-dəyər" cütləri toplusu. Elə real lüğət kimi, hər sözün (açar) öz mənası (dəyəri) var.
Əsas özəlliklər: Hər açar unikal olur. Açar dəyəri tez tapmaq üçün istifadə olunur. Elementlərin sırası adətən zəmanət verilmir.
Nə vaxt istifadə etməli? Hansısa unikal identifikator (açar) ilə dəyəri tez tapmaq lazımdırsa.
Həyatdan nümunə: Qeyd dəftəri (ad - telefon), məhsul bazası (məhsul ID - təsvir), app ayarları (ayar adı - dəyər).
Set-lər (Sets)
Nədir? Sırasız unikal elementlər toplusu. Elə riyazi çoxluq kimi.
Əsas özəlliklər: Təkrarlanan elementlər ola bilməz. Elementlərin sırası zəmanət verilmir. Elementin olub-olmadığını yoxlamaq və set əməliyyatları (birləşmə, kəsişmə) üçün optimallaşdırılıb.
Nə vaxt istifadə etməli? Unikal dəyərləri saxlamaq və elementin setdə olub-olmadığını tez yoxlamaq lazımdırsa.
Həyatdan nümunə: Sayta unikal ziyarətçilər siyahısı, məqalə üçün tag-lar, auto-complete üçün söz siyahısı (təkrarsız).
Queue-lar (Queues)
Nədir? "Birinci gəldi — birinci çıxdı" prinsipi ilə işləyən kolleksiya (FIFO - First-In, First-Out).
Əsas özəlliklər: Elementlər növbənin sonuna əlavə olunur və əvvəldən silinir.
Nə vaxt istifadə etməli? Emal sırası vacibdirsə, məsələn, support ticket sistemi, çap növbəsi.
Stack-lər (Stacks)
Nədir? "Sonuncu gəldi — birinci çıxdı" prinsipi ilə işləyən kolleksiya (LIFO - Last-In, First-Out).
Əsas özəlliklər: Elementlər bir tərəfdən (stack-in başı) əlavə və silinir.
Nə vaxt istifadə etməli? Əməliyyat tarixçəsini izləmək (redaktorda geri qaytarma), iç-içə strukturların işlənməsi, rekursiya.
Kolleksiya tipləri arasındakı fərqlər
| Kolleksiya tipi | Analogiya | Əsas prinsip | İndeks ilə giriş? | Elementlərin sırası? | Dublikatlara icazə? | Əsas əməliyyatlar |
|---|---|---|---|---|---|---|
| Massiv | Nömrələnmiş hüceyrələr sırası | Sabit ölçü | Bəli | Bəli | Bəli | İndeks ilə alma/qoyma |
| List | Alış-veriş siyahısı | Dinamik, sıralı | Bəli | Bəli | Bəli | Əlavə, silmə, axtarış |
| Dictionary | Lüğət (açar-dəyər) | Unikal açarlar | Xeyr | Xeyr (adətən) | Xeyr (açar üzrə) | Açar ilə alma, əlavə |
| Set | Unikal obyektlər toplusu | Yalnız unikal elementlər | Xeyr | Xeyr | Xeyr | Mövcudluq yoxlama, birləşmə |
| Queue | Kassada növbə | FIFO (Birinci gəldi - birinci çıxdı) | Xeyr | Bəli | Bəli | Sona əlavə, əvvəldən çıxarma |
| Stack | Boşqab yığını | LIFO (Sonuncu gəldi - birinci çıxdı) | Xeyr | Bəli | Bəli | Üstə əlavə, üstdən çıxarma |
3. List: List<T>
List — C#-da ən çox istifadə olunan kolleksiyadır. Hətta massivdən də çox. List — massivə bənzəyən kolleksiyadır, amma öz-özünə böyüyə bilir. Elementləri əlavə və silmək baş ağrısı olmadan mümkündür.
using System;
using System.Collections.Generic;
var numbers = new List<int>(); // Boş tam ədədlər listi yaradırıq
numbers.Add(10); // Element əlavə edirik
numbers.Add(15);
numbers.Add(42);
Console.WriteLine(numbers[0]); // 10
numbers.Remove(15); // Elementi dəyərə görə silirik
foreach (var number in numbers)
{
Console.WriteLine(number);
}
// Çap edəcək: 10 və 42
Niyə List<T> massivdən daha yaxşıdır, əgər kolleksiyanın ölçüsü əvvəlcədən məlum deyilsə?
— Çünki əlavə edəndə əl ilə yaddaş ayırmağa və massiv köçürməyə ehtiyac yoxdur — hər şeyi kolleksiya özü edir!
List<T> nə vaxt istifadə olunur?
- Dinamik siyahı, elementləri əlavə, silmək, dəyişmək lazımdırsa.
- Tez açar üzrə axtarış lazım deyil (bu dictionary üçündür).
- Əksər hallarda sıralı toplular üçün istifadə olunur.
4. Dictionary Dictionary<TKey, TValue>
Massiv (və list) dəyərləri massiv hüceyrələrində saxlayır və hər hüceyrənin indeksi var. Amma dictionary — elə kolleksiyadır ki, orda indeks əvəzinə string (ad) istifadə edə bilərsən. Belə hüceyrənin adı açar adlanır.
Əgər hansısa açar üzrə dəyəri tez tapmaq lazımdırsa (məsələn, oxucu biletinin nömrəsinə görə oxucunun adını), dictionary lazımdır.
using System.Collections.Generic;
var phoneBook = new Dictionary<string, string>();
phoneBook["Anya"] = "+79992221133";
phoneBook["Maksim"] = "+79998887766";
Console.WriteLine(phoneBook["Anya"]); // +79992221133
// Açarın olub-olmadığını yoxlamaq olar:
if (phoneBook.ContainsKey("Vasya"))
{
Console.WriteLine(phoneBook["Vasya"]);
}
else
{
Console.WriteLine("Belə nömrə yoxdur!");
}
Maraqlı fakt: Dictionary-lərə tez-tez "assosiativ massivlər" deyirlər. Onlar hash-table əsasında qurulub, bu da açar üzrə axtarışı çox tez edir (demək olar dərhal, kolliziyaları saymasaq — bu barədə sonra danışacağıq).
Əsas özəlliklər
- Açar unikal olur: dictionary-də iki eyni açar ola bilməz.
- Dəyərlər təkrarlana bilər.
- Açar üzrə elementləri çox tez tapır, əlavə və silir.
5. Set: HashSet<T>
List və dictionary-dən başqa çox məşhur olan set-lər var. Bu, demək olar ki, list kimidir, amma daha sadə: elementlərin sabit sırası yoxdur. Belə set sadəcə dəyərlər toplusunu saxlayır, əgər sıra vacib deyilsə.
Məsələn, sadəcə bilmək lazımdır ki, nəsə setdə var, təkrarsız və sıra önəmli deyil — onda set istifadə edirik.
using System.Collections.Generic;
var knownUsers = new HashSet<string>();
knownUsers.Add("admin");
knownUsers.Add("guest");
knownUsers.Add("admin"); // Təkrar əlavə — sayılmır
Console.WriteLine(knownUsers.Contains("admin")); // True
Console.WriteLine(knownUsers.Count); // 2
Set elementin olub-olmadığını çox tez yoxlayır.
Set-lər nə üçün lazımdır?
— Məsələn, ay ərzində app-i açan bütün unikal istifadəçiləri saxlamaq və ya kitab müəlliflərinin unikal siyahısı üçün.
Özəlliklər
- Yalnız unikal elementləri saxlayır (təkrar əlavə sayılmır).
- List kimi indeks yoxdur.
- Tez mövcudluq yoxlamaq olur.
6. Queue və stack-lər
Xüsusi hallar üçün başqa strukturlar da var: queue və stack. Əslində bunlar da list kimidir, sadəcə əlavə və çıxarma qaydası fərqlidir.
Queue<T>: növbə (first in — first out)
Bəzən "növbə" saxlamaq lazımdır — yeni element sona əlavə olunur, çıxarma isə əvvəldən olur.
using System.Collections.Generic;
var queue = new Queue<string>();
queue.Enqueue("Birinci");
queue.Enqueue("İkinci");
queue.Enqueue("Üçüncü");
Console.WriteLine(queue.Dequeue()); // "Birinci"
Console.WriteLine(queue.Peek()); // "İkinci", amma silmir
Stack<T>: stack (first in — last out)
Stack əksinə işləyir: sonuncu daxil olan birinci çıxır. Parser-lərdə, funksiya çağırışlarının işlənməsində və hətta redaktorlarda geri qaytarma üçün istifadə olunur.
using System.Collections.Generic;
var stack = new Stack<string>();
stack.Push("Bir");
stack.Push("İki");
stack.Push("Üç");
Console.WriteLine(stack.Pop()); // "Üç"
Console.WriteLine(stack.Peek()); // "İki"
7. Cədvəl: əsas kolleksiyaların müqayisəsi
| Kolleksiya | Unikal elementlər | İndeks ilə giriş | Tez açar üzrə axtarış | Əlavə/silmə əməliyyatları |
|---|---|---|---|---|
|
Xeyr | Bəli | Xeyr | Sona tez |
|
Açarlar | Xeyr | Bəli | Açar üzrə tez |
|
Bəli | Xeyr | Bəli* | Dəyərə görə tez |
|
Xeyr | Xeyr | Xeyr | Tez (FIFO) |
|
Xeyr | Xeyr | Xeyr | Tez (LIFO) |
Hər kolleksiyanı növbəti mühazirələrdə ətraflı öyrənəcəyik. Başlayırıq sirli <T> hərfi ilə...
GO TO FULL VERSION