CodeGym /Kurslar /C# SELF /İndeks üzrə giriş müqaviləsi:

İndeks üzrə giriş müqaviləsi: IList<T>

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

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>
.NET-də kolleksiya interfeyslərinin irsiliyi

IList<T> interfeysinin əsas üzvləri

Üzv Təyinatı
T this[int index] { get; set; }
Elementə indekslə baxmaq və ya onu dəyişmək
int IndexOf(T item)
Elementin ilk tapıldığı indeksini tapmaq
void Insert(int index, T item)
Elementi verilmiş mövqeyə əlavə etmək
void RemoveAt(int index)
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
List<T>
Bəli Dinamiki massiv
T[]
Bəli Adi massivlər indekslənir
BindingList<T>
Bəli Data binding üçün istifadə olunur
ObservableCollection<T>
Bəli Xəbərdarlıqlı siyahı
Collection<T>
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!).

2
Tapşırıq
C# SELF, səviyyə, dərs
Bağlanıb
Insert və IndexOf metodları ilə işləmək
Insert və IndexOf metodları ilə işləmək
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION