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) барои дастрасии кӯтоҳтар ба қисмҳои массивҳо ё рӯйхатҳо истифода мешуданд, ки махсусан дар кор бо зернависҳо ё маълумоти қисман аз коллексияҳо муфид аст.