Sobes.tech
Junior

Kas ir indeksi C#? Kādi indeksa veidi pastāv un vai esat tos izmantojis praksē?

sobes.tech AI

Atbilde no AI

C# indeksatori ļauj piekļūt klases vai struktūras eksemplāram kā masīvam, izmantojot sintaksi []. Tie nav statiski un pārdefinē operatoru [].

Indeksatori

Indeksatori ļauj definēt piekļuves loģiku kolekcijas elementiem vai datu struktūrai klasē.

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

    // Indeksators, kas ļauj iegūt vai iestatīt elementu pēc indeksa
    public string this[int index]
    {
        get
        {
            // Robežu pārbaude
            if (index >= 0 && index < data.Length)
            {
                return data[index];
            }
            else
            {
                throw new IndexOutOfRangeException();
            }
        }
        set
        {
            // Robežu pārbaude
            if (index >= 0 && index < data.Length)
            {
                data[index] = value;
            }
            else
            {
                throw new IndexOutOfRangeException();
            }
        }
    }
}

Indeksatoru tipi

Indeksatori var pieņemt jebkādu parametru skaitu un tipu, ne tikai veselos skaitļos.

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

    // Indeksators ar string tipu
    public string this[string key]
    {
        get
        {
            if (_dictionary.ContainsKey(key))
            {
                return _dictionary[key];
            }
            else
            {
                return null; // vai izsaukt izņēmumu
            }
        }
        set
        {
            _dictionary[key] = value;
        }
    }
}

Pārkrauti indeksatori

Var izveidot pārkrautus indeksatorus ar dažādām parakstām (parametru kopām un tipiem).

public class Matrix
{
    private int[,] data;

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

    // Indeksators ar diviem veselo skaitļu parametriem
    public int this[int row, int col]
    {
        get
        {
            // Robežu pārbaude
            if (row >= 0 && row < data.GetLength(0) && col >= 0 && col < data.GetLength(1))
            {
                return data[row, col];
            }
            else
            {
                throw new IndexOutOfRangeException();
            }
        }
        set
        {
            // Robežu pārbaude
            if (row >= 0 && row < data.GetLength(0) && col >= 0 && col < data.GetLength(1))
            {
                data[row, col] = value;
            }
            else
            {
                throw new IndexOutOfRangeException();
            }
        }
    }
}

Diapazona indeksi (Ranges & Indices)

No C# 8.0 tika ieviesti jauni System.Index un System.Range tipi, kas ļauj izmantot sintaksi, lai piekļūtu elementiem no kolekcijas beigām (^) un iegūtu apakšdiapazonus (..). Šie jēdzieni bieži saukti par "indeksu", bet tie atšķiras no klasiskajiem indeksatoriem.

using System;

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

        // Izmantojot System.Index, lai piekļūtu no beigām
        Index last = ^1; // Pēdējā elementa indekss
        Console.WriteLine(words[last]); // dog

        // Izmantojot System.Range, lai iegūtu apakšdiapazonu
        Range middle = 1..4; // Elementi no indeksa 1 līdz (neiekļaujot) indeksam 4
        string[] subset = words[middle]; // {"quick", "brown", "fox"}

        // Range ar System.Index
        Range fromEnd = ^3..; // no trešā no beigām līdz beigām
        string[] suffix = words[fromEnd]; // {"the", "lazy", "dog"}
    }
}

Praktiska pielietojuma piemēri

Es aktīvi izmantoju indeksatorus, izveidojot savas kolekciju klases vai apvalkus virs esošajām, lai nodrošinātu intuitīvāku piekļuvi datiem. Piemēram:

  • Klasu izstrāde, kas pārstāv matricu vai daudzdimensiju datus, kur piekļuve pēc koordinātām matrix[row, col] ir loģiska.
  • Apvalku izveide virs Dictionary<> vai citu kolekciju, kur piekļuve pēc atslēgas ar indeksatoru uzlabo koda lasāmību.
  • Vienkāršās kolekcijās, kur bija nepieciešama sintakses ērtība piekļuvei, līdzīga masīvam.

Diapazona indeksi (System.Index un System.Range) tika izmantoti, lai ērtāk piekļūtu masīvu vai sarakstu daļām, kas īpaši noderīgi, strādājot ar virknes vai daļēju kolekciju daļām.