Как реализовать чистый инициализатор пользовательских объектов для класса Matrix

У меня есть обычай Matrix класс, в котором я хотел бы реализовать собственный инициализатор объекта, аналогичный тому, который может использовать double[,], но не могу понять, как его реализовать.

В идеале хотелось бы, чтобы это выглядело так

var m1 = new Matrix
        {
            { 1.0, 3.0, 5.0 },
            { 7.0, 1.0, 5.0 }
        };

на данный момент у меня есть обычный конструктор с подписью

public Matrix(double[,] inputArray){...}

который принимает вызов как этот

var m1 = new Matrix(new double[,]
        {
            { 1.0, 3.0, 5.0 },
            { 7.0, 1.0, 5.0 }
        });

и объектный инициализатор, который принимает следующее использование, наследуя IEnumerable<double[]> интерфейс и реализация публичной пустоты Add(double[] doubleVector) метод

var m2 = new Matrix
        {
            new [] { 1.0, 3.0, 5.0 },                
            new [] { 7.0, 1.0, 5.0 }
        };

когда я пытаюсь использовать объектный инициализатор, я хотел бы получить ошибку компилятора из-за отсутствия перегрузки для Add это принимает X количество аргументов, где X - количество столбцов, которые я пытаюсь создать (т.е. в моих предоставленных примерах 3).

Как я могу настроить свой класс так, чтобы он использовал аргумент, который я предоставил?

1 ответ

Решение

Определять Add метод с params ключевое слово и игнорировать конечный элемент в массиве, который длиннее ширины матрицы

public void Add(params double[] doubleVector)
{
   // code
}

если массив короче, элементы по умолчанию остаются (0)

// sample
var M = new Matrix()
{
    { 1.2, 1.0 },
    { 1.2, 1.0, 3.2, 3.4}
};
Другие вопросы по тегам