CodeGym /Kurslar /C# SELF /Əsas kolleksiya tiplərinə baxış

Əsas kolleksiya tiplərinə baxış

C# SELF
Səviyyə , Dərs
Mövcuddur

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: queuestack. Ə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ı
List<T>
Xeyr Bəli Xeyr Sona tez
Dictionary<K,V>
Açarlar Xeyr Bəli Açar üzrə tez
HashSet<T>
Bəli Xeyr Bəli* Dəyərə görə tez
Queue<T>
Xeyr Xeyr Xeyr Tez (FIFO)
Stack<T>
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ə...

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION