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"}

        // Range օգտագործելով System.Index
        Range fromEnd = ^3..; // երրորդից վերջից մինչև վերջ
        string[] suffix = words[fromEnd]; // {"the", "lazy", "dog"}
    }
}

Практическое применение

Ես ակտիվորեն օգտագործել եմ ինդեքսատորները՝ ստեղծելով սեփական հավաքածուի դասեր կամ օղակներ՝ ավելի ինտուիտիվ հասանելիություն ապահովելու համար։ Օրինակ՝

  • Դիզայն՝ մատրիցներ կամ բազմաչափ տվյալներ ներկայացնող դասեր, որտեղ հասանելիությունը ըստ կոորդինատների matrix[row, col] տրամաբանական է։
  • Օղակների ստեղծում՝ Dictionary<> կամ այլ հավաքածուների վրա, որտեղ հասանելիությունը ըստ բանալիի՝ ինդեքսատորով, բարելավում է կոդի ընթեռնելիությունը։
  • Հեշտ հավաքածուներում, որտեղ անհրաժեշտ է սինտաքսային հարմարավետություն՝ ինչպես զանգվածի դեպքում։

Տարածքային ինդեքսատորները (System.Index և System.Range) օգտագործվել են մասերի արագ հասանելիության համար զանգվածների կամ ցանկերի մեջ, ինչը հատկապես օգտակար է ենթատեքստերի կամ մասային տվյալների աշխատանքի ժամանակ։