1. Giriş
Deməli, təsəvvür elə: səndə bir kolleksiya var... və sənə tez bir zamanda üçüncü, yeddinci və ya, məsələn, sıfırıncı elementi tapmaq lazımdır. Və ya onları yerlə dəyişmək. Massivdə bu asandır — indekslə (array[3]). Bəs kolleksiyalarda necə? Axı bütün kolleksiyalar eyni dərəcədə indekslənmir!
Burada səhnəyə IList<T> interfeysi çıxır — universal müqavilə, hansı ki, kolleksiyadan tələb edir ki, elementlərlə indeks üzrə işləməyi dəstəkləsin. Qısaca: səndə IList<T> reallaşdıran kolleksiya varsa, deməli, onun elementlərinə indekslə (massivdəki kimi) rahatca müraciət edə və onları yerindəcə dəyişə bilərsən.
Bənzətmə:
Kitabxana kartını xatırla: hər kitabın rəfdə öz sıra nömrəsi var və sən həmişə "üçüncü sıradakı" kitaba yaxınlaşıb onu götürə bilərsən. Bax, IList<T> dəstəkləyən kolleksiya belə işləyir.
2. IList<T> ümumi quruluşu və metodları
IList<T> interfeysi — bir çox kolleksiyanın qəhrəmanıdır. O, ICollection<T> (o da öz növbəsində IEnumerable<T> — bu da kolleksiyada dövr etməyə imkan verir) genişləndirir və ən vacib şeyi əlavə edir: indekslə işləməyi.
İnterfeyslərin irsi sxemi:
IEnumerable<T>
▲
│
ICollection<T>
▲
│
IList<T>
IList<T> interfeysinin əsas üzvləri
| Üzv | Təyinatı |
|---|---|
|
Elementə indekslə baxmaq və ya onu dəyişmək |
|
Elementin ilk tapıldığı indeksini tapmaq |
|
Elementi verilmiş mövqeyə əlavə etmək |
|
Elementi indekslə silmək |
Qalan üzvlər, məsələn, Add, Remove, Clear, Contains — ICollection<T> interfeysindən gəlir.
Açar məqam: indeksator
IList<T>-in əsas "fəndi" — indeksatorun olmasıdır. Bu elə bir sintaksis şirniyyatıdır ki, sən belə yaza bilirsən:
var myList = new List<int> { 10, 20, 30 };
int secondValue = myList[1]; // 20-ni alırıq
myList[2] = 42; // Üçüncü elementi dəyişirik
3. Hansı kolleksiyalar IList<T> reallaşdırır
.NET-in standart kitabxanasında bir çox tanış strukturlar IList<T> interfeysini dəstəkləyir. Gəlin ən populyarlarına baxaq:
| Kolleksiya | İndeksləmə | Təsviri |
|---|---|---|
|
Bəli | Dinamiki massiv |
|
Bəli | Adi massivlər indekslənir |
|
Bəli | Data binding üçün istifadə olunur |
|
Bəli | Xəbərdarlıqlı siyahı |
|
Bəli | Kolleksiyalar üçün baza sinif |
Diqqət:
LinkedList<T> və
HashSet<T>
YOX
IList<T> reallaşdırmır, çünki onlarda sürətli indeksləmə yoxdur (bəli,
LinkedList<T>-də
list[5] yoxdur!).
4. IList<T> istifadəsinə nümunələr
İndeks üzrə almaq və dəyişmək
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
IList<string> fruits = new List<string> { "Alma", "Banan", "Armud" };
// İkinci elementi almaq
string fruit = fruits[1];
Console.WriteLine(fruit); // Banan
// Üçüncü elementi dəyişmək
fruits[2] = "Portağal";
Console.WriteLine(fruits[2]); // Portağal
}
}
İndeks üzrə əlavə və silmək
fruits.Insert(1, "Kivi"); // "Kivi"ni ikinci yerə əlavə edirik
// Siyahı indi: "Alma", "Kivi", "Banan", "Portağal"
fruits.RemoveAt(0); // Birinci elementi ("Alma") silirik
// Siyahı indi: "Kivi", "Banan", "Portağal"
Elementin indeksini tapmaq
int index = fruits.IndexOf("Portağal"); // İndeksi (2) qaytaracaq və ya -1, tapılmasa
if (index != -1)
Console.WriteLine("Portağal bu mövqedədir: " + index);
else
Console.WriteLine("Portağal tapılmadı");
5. Reallaşdırma xüsusiyyətləri və tipik səhvlər
IList<T> ilə işləyəndə asanlıqla bir neçə "tələ"yə düşmək olar, xüsusən də unutsaq ki, indeksləmə sıfırdan başlayır və kolleksiyanın uzunluğu — bu, cari elementlərin sayıdır.
Məsələn, mövcud olmayan elementə müraciət cəhdi:
Console.WriteLine(fruits[100]); // IndexOutOfRangeException!
C#-da indekslər — yumurtlayan toyuqlar kimidir: sıfırdan başlayır, bir yox. Siyahıda 4 element varsa, son indeks — 3-dür.
Bir də yadında saxla ki, bütün IList<T> reallaşdırmaları eyni sürətli deyil. Məsələn, massivdə və ya List<T>-də indekslə giriş ani olur (O(1)), amma əgər sən öz kolleksiyanı bağlı siyahı əsasında qurub ona IList<T> əlavə etsən, əməliyyat yavaş ola bilər. Amma standart kitabxana belə etmir.
Bir də belə bir məqam var: əgər massivlə IList<T> kimi işləyirsənsə, elementləri dəyişə bilərsən, amma massiv ölçüsünü dəyişə bilməzsən. Add, Remove, Insert və s. metodları massiv üçün NotSupportedException atacaq.
int[] myArray = { 1, 2, 3 };
IList<int> listView = myArray; // Upcast
listView[0] = 42; // İşləyir!
listView.Add(99); // NotSupportedException atacaq
6. Praktik tətbiq və bu nəyə lazımdır
Real layihələrdə demək olar ki, hər ikinci kolleksiya — IList<T> reallaşdıran bir şeydir, çünki elementlərə nömrə ilə tez çatmaq, onları dəyişmək, mövqeyə görə əlavə və silmək rahatdır. Məsələn:
- WPF və ya WinForms-da ViewModel-də interfeys property-ləri, hansı ki, UI elementlərinin siyahılarına bind olunur.
- Sıralama, axtarış, permutasiya alqoritmlərinin reallaşdırılması, harada indekslə giriş lazımdır.
- Dinamik obyekt siyahısı ilə işləyən data import/export modulları.
Müsahibədə IEnumerable<T>, ICollection<T> və IList<T> fərqləri barədə sual — klassikadır. Hər səviyyənin nəyə cavabdeh olduğunu bilsən, müsahibədə rahat izah edə bilərsən ki, niyə HashSet<T> IList<T> reallaşdırmır (çünki unikal olmaq, sıra və indeksdən vacibdir!).
GO TO FULL VERSION