Я создал новый класс для определения N-мерной матрицы на C#, однако, если я хочу получить доступ к ее элементам и не знаю, как действовать более чем с одним индексом. Элементы хранятся в массиве двойных массивов.
private class MatrixND
{
private double[][] elements;
public MatrixND()
{
elements = new double[N][];
}
}
Обычно для доступа к индексу в собственном классе я добавляю в класс следующий метод:
public double this[int index]
{
get
{
return elements[index];
}
set
{
elements[index] = value;
}
}
Это сработало бы, если бы это был простой массив двойных чисел, тогда вызов индекса [i], где я может быть любым числом от 0 до длины массива, вернет двойное число.
Как мне сделать то же самое, но для моего матричного случая, чтобы я мог вызвать mymatrix[index1][index2] и получить дубль?
Большое спасибо!
Извините, если я вас неправильно понял, прямоугольный означает одинаковое количество строк и столбцов? Если да, то в данном случае да, но в будущем я хотел бы расширить его до другого количества столбцов и строк.
Да, прямоугольный здесь будет означать, что каждая строка имеет одинаковую длину (или, альтернативно и эквивалентно: каждый столбец имеет одинаковую высоту)
Просто вернуть двойной [] вместо простого двойного из вашего индексатора?
Если вы пойдете по маршруту double[], не забудьте удалить установщик индексатора, который вам не нужен.
Что собираешься делать с mymatrix[index1][index2] ? Это просто значение или вы хотите получить доступ к внутренним функциям mymatrix? Рассмотрите возможность возврата оболочки из индексатора, которая берет текущий основной экземпляр и расширяет его необходимыми функциями, например. матрица[i] -> строка, строка[i] -> ячейка и т. д.
@Ральф, ты хочешь опубликовать свой ответ? Я приму это, потому что это было буквально то, чего я хотел! Оказалось, что я был почти у цели, но, клянусь, я не осознавал, что это настолько очевидно, хе-хе
@Lluis, я не гонюсь за репутацией. Я уже рад, что смог быть полезен.
Хорошо, тогда я приму вариант Марка и предложу включить ваш вариант, еще раз спасибо!





Если вы используете public double this[int x, int y], вызывающая сторона может получить доступ к obj[7, 12] и т. д. Однако для доступа obj[7][12] потребуется, чтобы первый индексатор возвращал тип, который сам имеет другой индексатор - возможно, struct, который просто содержит родительский экземпляр и первое значение индекса, эффективно откладывая полное поиск до тех пор, пока не будет указан второй индекс.
Что-то вроде:
public sealed class MatrixND
{
private const int N = 42; // or a a.ctor arg, whatever
private double[][] elements;
public MatrixND()
{
elements = new double[N][];
}
public Indexer this[int x] => new(this, x);
public readonly struct Indexer(MatrixND parent, int x)
{
public double this[int y]
{
get => parent.elements[x][y];
set => parent.elements[x][y] = value;
}
}
}
Примечание:
double[,]может быть более эффективным, если данные имеют прямоугольную форму.