Sobes.tech
Junior

C#да индекстер эмне? Кантип түрлөрү бар жана сиз аларды практикалыкта колдонуп жатасызбы?

sobes.tech AI

AIден жооп

Индексираторлор C#да класс же структуранын экземплярлоруна массив сыяктуу кайрылууга мүмкүндүк берет, [] синтаксисин колдонуп. Алар статикалык эмес жана [] операторун кайра жүктөйт.

Индексираторлор

Индексираторлор коллекция же маалымат структурасына кирүү логикасын аныктоого мүмкүндүк берет, класс ичинде.

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

    // Индексиратор, ал элементти индекс боюнча алуу же коюу үчүн
    public string this[int index]
    {
        get
        {
            // Чек чектөөнү текшерүү
            if (index >= 0 && index < data.Length)
            {
                return data[index];
            }
            else
            {
                throw new IndexOutOfRangeException();
            }
        }
        set
        {
            // Чек чектөөнү текшерүү
            if (index >= 0 && index < data.Length)
            {
                data[index] = value;
            }
            else
            {
                throw new IndexOutOfRangeException();
            }
        }
    }
}

Индексираторлордун параметрлеринин түрлөрү

Индексираторлор ар кандай түрдөгү параметрлерди кабыл алат, жана булар бүт сандар гана эмес.

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

    // string түрүндөгү параметр менен индексиратор
    public string this[string key]
    {
        get
        {
            if (_dictionary.ContainsKey(key))
            {
                return _dictionary[key];
            }
            else
            {
                return null; // же исключение жүктөө
            }
        }
        set
        {
            _dictionary[key] = value;
        }
    }
}

Индексираторлорду жүктөө

Төрттүрдүү параметрлер менен (собо жана түрлөрү) жүктөөчү индексираторлорду түзүүгө болот.

public class Matrix
{
    private int[,] data;

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

    // эки бүт сан параметри менен индексиратор
    public int this[int row, int col]
    {
        get
        {
            // Чек чектөөнү текшерүү
            if (row >= 0 && row < data.GetLength(0) && col >= 0 && col < data.GetLength(1))
            {
                return data[row, col];
            }
            else
            {
                throw new IndexOutOfRangeException();
            }
        }
        set
        {
            // Чек чектөөнү текшерүү
            if (row >= 0 && row < data.GetLength(0) && col >= 0 && col < data.GetLength(1))
            {
                data[row, col] = value;
            }
            else
            {
                throw new IndexOutOfRangeException();
            }
        }
    }
}

Диапазондук индекстер (Ranges & Indices)

C# 8.0да System.Index жана System.Range жаңы түрлөрү киргизилди, алар ^ синтаксисин колдонуп коллекциянын аягынан элементтерге кайрылууга жана .. менен бөлүктөрдү алуу үчүн мүмкүндүк берет. Бул түшүнүктөр көбүнчө "индекстер" деп аталат, бирок алар классикалык индексирактардан айырмаланат.

using System;

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

        // System.Index колдонуу менен акыркыдан кайрылуу
        Index last = ^1; // акыркы элементтин индекс
        Console.WriteLine(words[last]); // dog

        // System.Range колдонуу менен бөлүктү алуу
        Range middle = 1..4; // 1-индексден 4-индекске чейин (эч камтылбайт)
        string[] subset = words[middle]; // {"quick", "brown", "fox"}

        // System.Index колдонуп Range
        Range fromEnd = ^3..; // үчтөн акырынан баштап аякка чейин
        string[] suffix = words[fromEnd]; // {"the", "lazy", "dog"}
    }
}

Практикалык колдонуу

Мен активдүү өзүмдүн коллекция класстарыма же бар колдонууларына индексирактарды колдонуп, маалыматка көбүрөөк интуитивдүү жетүүнү камсыз кылдым. Мисалдар:

  • Матриче же көп өлчөмдүү маалыматтарды көрсөтүүчү класстарды иштеп чыгуу, анда координаталар аркылуу жетүү логикалык.
  • Dictionary<> же башка коллекциялардын үстүнө обгурздар түзүү, анда ачкыч аркылуу жетүү кодуңун окумдуулугун жакшыртат.
  • Жөнөкөй коллекцияларында, синтаксистик ыңгайлуулук үчүн, массив сыяктуу.

Диапазондук индекстер (System.Index жана System.Range) массивдердин же тизмелердин бөлүктөрүнө кыска жетүүнү камсыз кылуу үчүн колдонулуп, бул бөлүмдөр менен иштөөдө пайдалуу болот.