Как эмулировать / наследовать синтаксис инициализации массива c #? - PullRequest
2 голосов
/ 30 сентября 2010

Я строю матричный класс (я знаю, что он существует), я думаю об инициализации.В настоящее время одной из инициализаций является

  double[,] data;
  public Matrix(double[,] data)
  {
      if (data.GetLength(0) == 0 || data.GetLength(1) == 0)
      {
          throw new ArgumentException();
      }
      this.data = (double[,])(data.Clone());
  }

, что приятно, потому что она может быть инициализирована как

  Matrix matrix= new Matrix(new double[,]{{1, 0  , 0  },
                                           {1, 0.5, 0  }});

Есть ли способ сделать это более компактным, что-то вроде

  Matrix matrix= new Matrix{{1,0}, {1,1}, {1,5}};

или даже лучше

  Matrix matrix = {{1,0}, {1,1}, {1,5}};

?

Ответы [ 2 ]

4 голосов
/ 30 сентября 2010

Ну, не последний - но предпоследний, по крайней мере, возможен с использованием инициализаторов коллекции:

  • Реализация IEnumerable (что может быть сделано явно, с исключениемесли вы действительно не хотите, чтобы он вызывался нормально)
  • Создайте Add(params double[] values) метод

Проблема в том, что это делает вашу матрицу изменчивой.Вы могли бы потенциально создать класс MatrixBuilder и использовать:

Matrix matrix = new MatrixBuilder{{1,0}, {1,1}, {1,5}}.Build();

Конечно, есть и другие проблемы - вам нужно убедиться, что «матрица» не запустилась внезапноизменение размеров на полпути, например

Matrix matrix = new MatrixBuilder{{1,0}, {1,1,2,2,2,2,2,2}, {1,5}}.Build();
3 голосов
/ 30 сентября 2010

Вы можете использовать оператор неявного преобразования для создания кода, подобного этому:

Matrix matrix = new double[,] {{1,0}, {1,1}, {1,5}};

Это связанный код:

class Matrix {
  // ...
  public static implicit operator Matrix(double[,] data) {
    return new Matrix(data);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...