Sobes.tech
Junior

Šta su indeksi u C#? Koje vrste indeksa postoje i da li ste ih koristili u praksi?

sobes.tech АИ

Одговор од АИ

Индексирачи у 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) су коришћени за краћи приступ деловима масива или листа, што је посебно корисно при раду са поднизовима или делимичним подацима из колекција.