Sobes.tech
Junior

Mis on indeksid C#-s? Millised indeksitüübid on olemas ja kas olete neid praktikas kasutanud?

sobes.tech AI

Vastus AI-lt

C# indeksatorid võimaldavad pöörduda klassi või struktuuri eksemplari kui massiivi, kasutades süntaksit []. Nad ei ole staatilised ning ülekoormavad [] operaatorit.

Indeksatorid

Indeksatorid võimaldavad määratleda juurdepääsuloogika kogumitelementidele või andmestruktuurile klassi sees.

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

    // Indeksator, mis võimaldab saada või määrata elementi indeksi järgi
    public string this[int index]
    {
        get
        {
            // Piirangute kontroll
            if (index >= 0 && index < data.Length)
            {
                return data[index];
            }
            else
            {
                throw new IndexOutOfRangeException();
            }
        }
        set
        {
            // Piirangute kontroll
            if (index >= 0 && index < data.Length)
            {
                data[index] = value;
            }
            else
            {
                throw new IndexOutOfRangeException();
            }
        }
    }
}

Indeksatorite tüübid

Indeksatorid võivad võtta vastu mistahes arvu ja tüüpi parameetreid, mitte ainult täisarvulisi.

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

    // Indeksator string-tüüpi parameetriga
    public string this[string key]
    {
        get
        {
            if (_dictionary.ContainsKey(key))
            {
                return _dictionary[key];
            }
            else
            {
                return null; // või visata erind
            }
        }
        set
        {
            _dictionary[key] = value;
        }
    }
}

Ülekoormatud indeksatorid

Võib luua ülekoormatud indeksatoreid erinevate signatuuridega (parameetrite kogum ja tüübid).

public class Matrix
{
    private int[,] data;

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

    // Indeksator kahe täisarvulise parameetriga
    public int this[int row, int col]
    {
        get
        {
            // Piirangute kontroll
            if (row >= 0 && row < data.GetLength(0) && col >= 0 && col < data.GetLength(1))
            {
                return data[row, col];
            }
            else
            {
                throw new IndexOutOfRangeException();
            }
        }
        set
        {
            // Piirangute kontroll
            if (row >= 0 && row < data.GetLength(0) && col >= 0 && col < data.GetLength(1))
            {
                data[row, col] = value;
            }
            else
            {
                throw new IndexOutOfRangeException();
            }
        }
    }
}

Vahemiku indeksid (Ranges & Indices)

Alates C# 8.0 on sisse viidud uued tüübid System.Index ja System.Range, mis võimaldavad kasutada süntaksit elementidele juurdepääsuks lõpu poole (^) ja alamvahemike saamiseks (..). Neid mõisteid nimetatakse sageli "indeksiteks", kuid need erinevad klassikalistest indeksatoritest.

using System;

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

        // Kasutades System.Index lõpu poole pöördumiseks
        Index last = ^1; // Viimane element
        Console.WriteLine(words[last]); // dog

        // Kasutades System.Range alamvahemiku saamiseks
        Range middle = 1..4; // Elementidest indeksiga 1 kuni (mitte kaasa arvatud) indeksiga 4
        string[] subset = words[middle]; // {"quick", "brown", "fox"}

        // Range kasutades System.Index
        Range fromEnd = ^3..; // kolmas lõpu poole ja kuni lõpuni
        string[] suffix = words[fromEnd]; // {"the", "lazy", "dog"}
    }
}