Sobes.tech
Junior

C#-da indekslər nədir? Hansı indeks növləri mövcuddur və onları praktiki olaraq istifadə etdinizmi?

sobes.tech Süni İntellekt

AI-dan cavab

C#-də indeksatorlar sinif və ya struktur nümunəsinə massiv kimi müraciət etməyə imkan verir, [] sintaksisi istifadə edərək. Onlar statik deyil və [] operatorunu yükləyirlər.

İndeksatorlar

İndeksatorlar sinif daxilində kolleksiya və ya məlumat strukturlarına giriş loqikasını müəyyən etməyə imkan verir.

public class MyCollection
{
    private string[] data = new string[10];

    // İndeksator, elementin indeksə görə alınması və ya təyin olunması üçün
    public string this[int index]
    {
        get
        {
            // Sərhəd yoxlaması
            if (index >= 0 && index < data.Length)
            {
                return data[index];
            }
            else
            {
                throw new IndexOutOfRangeException();
            }
        }
        set
        {
            // Sərhəd yoxlaması
            if (index >= 0 && index < data.Length)
            {
                data[index] = value;
            }
            else
            {
                throw new IndexOutOfRangeException();
            }
        }
    }
}

İndeksator parametrlərinin növləri

İndeksatorlar istənilən sayda və hər hansı tiplərdə parametrlər qəbul edə bilər, yalnız tam ədədlərlə məhdudlaşmır.

public class DictionaryLike
{
    private Dictionary<string, string> _dictionary = new Dictionary<string, string>();

    // String tipli parametr ilə indeksator
    public string this[string key]
    {
        get
        {
            if (_dictionary.ContainsKey(key))
            {
                return _dictionary[key];
            }
            else
            {
                return null; // və ya istənilən istisna
            }
        }
        set
        {
            _dictionary[key] = value;
        }
    }
}

İndeksatorların yüklənməsi

Fərqli parametr və tiplərlə yüklənmiş indeksatorlar yaradıla bilər.

public class Matrix
{
    private int[,] data;

    public Matrix(int rows, int cols)
    {
        data = new int[rows, cols];
    }

    // İki tam ədəd parametrli indeksator
    public int this[int row, int col]
    {
        get
        {
            // Sərhəd yoxlaması
            if (row >= 0 && row < data.GetLength(0) && col >= 0 && col < data.GetLength(1))
            {
                return data[row, col];
            }
            else
            {
                throw new IndexOutOfRangeException();
            }
        }
        set
        {
            // Sərhəd yoxlaması
            if (row >= 0 && row < data.GetLength(0) && col >= 0 && col < data.GetLength(1))
            {
                data[row, col] = value;
            }
            else
            {
                throw new IndexOutOfRangeException();
            }
        }
    }
}

Aralıq indekslər (Ranges & Indices)

C# 8.0 ilə System.IndexSystem.Range yeni turlar tanıdıldı, onlar massiv elementlərinə sonundan müraciət (^) və alt aralıq alma (..) üçün sintaksis təmin edir. Bu anlayışlar çox vaxt "indeks" adlandırılır, amma onlar klassik indeksatorlardan fərqlidir.

using System;

public class ArrayExample
{
    public static void Main(string[] args)
    {
        string[] words = { "the", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog" };

        // System.Index istifadə edərək sonundan müraciət
        Index last = ^1; // son elementin indeksi
        Console.WriteLine(words[last]); // dog

        // System.Range istifadə edərək alt aralıq alma
        Range middle = 1..4; // 1-indeksindən 4-ə qədər (4 daxil deyil)
        string[] subset = words[middle]; // {"quick", "brown", "fox"}

        // System.Index ilə Range
        Range fromEnd = ^3..; // sondan üçüncü elementdən başlayaraq
        string[] suffix = words[fromEnd]; // {"the", "lazy", "dog"}
    }
}

Tətbiqi nümunə

Mən indeksatorlardan aktiv istifadə etdim öz kolleksiya siniflərimi və ya mövcud kolleksiyalar üzərində daha intuitiv giriş təmin etmək üçün. Məsələn:

  • Matrisalar və ya çoxölçülü məlumatları təmsil edən siniflərin yaradılması, burada matrix[row, col] giriş məntiqli idi.
  • Dictionary<> və ya digər kolleksiyalar üzərində wrapper-lər yaratmaq, burada açar üzrə giriş kodun oxunuşunu yaxşılaşdırır.
  • Sadə kolleksiyalarda, array kimi sintaktik rahat giriş üçün.

Range indeksləri (System.IndexSystem.Range) massivlər və ya siyahıların hissələrinə daha qısa giriş üçün istifadə edildi, bu xüsusilə alt sətirlər və ya kolleksiyadan qismən məlumatlar ilə işləməkdə faydalıdır.