Skip to content

Индексация и индексаторы

edited March 2022 in Tutorials

Для строк и массивов

Применение синтаксиса индексации к строкам - это синтаксический сахар для вызова CharAt, а если индекса два (диапазон), то для Slice. Для массивов диапазоны это тоже Slice.

string s="test";
WriteLine(s[2]); //s //s[2] - это s.CharAt(2). Индекс не может быть отрицательным! 
//если нужен доступ к символам через отрицательный индекс, то используйте At:
WriteLine(s.At(-3)); //e
//если нужно взять подстроку в диапазоне, то:
WriteLine(s[1..3]); //es //s[1..3] - это s.Slice(1, 3)
WriteLine(s[1, 3]); //можно и так. На самом деле для интерпретатора s[1..3] это s[1, 3].  
//для массивов тоже работает:
int[] arr={0, 10, 20, 30, 40, 50};
WriteLine(Join(' ', arr[1..-1])); //10 20 30 40 //arr[1..-1] - это arr.Slice(1, -1)
//с отрицательным индексом:
WriteLine(arr.At(-3)); //30

Для объектов своих типов

Методы индексатора это GetItem и SetItem, которые вызываются при применении к экземпляру синтаксиса индексирования (квадратных скобок): объект[индекс-0, индекс-1, индекс-2, ...]. Пример матрицы с индексатором:

int mw=3, mh=4, v;
Matrix m=new Matrix(mw, mh);
foreach(int y in Range(mh)){
    foreach(int x in Range(mw)){
        m[x, y]=v++; //это m.SetItem(x, y, v++);
    }
}
WriteLine(m[0, 0]); //0 //m[0, 0] - это m.GetItem(0, 0);
WriteLine(m[1, 2]); //7
WriteLine(m[2, 3]); //11

class Matrix{
    int[] Arr;
    int Width, Height, Count;

    New(int w, int h){
        Width=w;
        Height=h;
        Count=w*h;
        Arr=new int[Count]; //по сути, матрица делается из обычного массива
    }
    public int GetItem(int x, int y){ //это метод индексатора возвращающий значение
        return Arr[GetIndex(x, y)];
    }
    public SetItem(int x, int y, int value){ //это метод индексатора устанавливающий значение
        Arr[GetIndex(x, y)]=value;
    }
    int GetIndex(int x, int y){ //эта функция возвращает реальный индекс в массиве из x и y
        return x + (y * Width);
    }
}

GetItem и SetItem должны быть публичными.

Sign In or Register to comment.