我有一个名为Matrix : IEnumerable<double>
的类,(经典的,数学矩阵。它基本上是一个带有一些好东西的2D数组)。
该类是不可变的,因此在创建实例后无法更改其值。
如果想要创建一个具有预先存在的值的矩阵,我必须将数组传递给构造函数,如下所示:
double[,] arr = new double[,]
{
{1,2,3}, {4,5,6}, {7,8,9}
};
Matrix m = new Matrix(arr);
有没有办法把它变成这个:(?)
Matrix m = new Matrix
{
{1,2,3}, {4,5,6}, {7,8,9}
};
更新
找到一种黑客的方式让它发挥作用。我不确定这个解决方案是否可行,但它确实有效。
class Matrix : ICloneable, IEnumerable<double>
{
// Height & Width are initialized in a constructor beforehand.
/*
* Usage:
* var mat = new Matrix(3, 4)
* {
* {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12}
* };
*/
int rowIndex;
bool allowArrayInitializer;
double[,] tempData;
double[,] data;
public void Add(params double[] args)
{
if(!allowArrayInitializer)
throw new InvalidOperationException("Cannot use array initializer");
if(args.Length != Width || rowIndex >= Height)
throw new InvalidOperationException("Invalid array initializer.");
for(int i = 0; i < Width; i++)
tempData[i, rowIndex] = args[i];
if(++rowIndex == Height)
data = tempData;
}
}
答案 0 :(得分:5)
如果它是不可变的那么;语法糖是使用Add()
实现的。
答案 1 :(得分:0)
您无法通过初始化程序执行此操作,但应该可以通过参数化构造函数执行此操作。 您可以在下面看到示例代码:
class Matrix : IEnumerable<double>
{
double[,] input;
public Matrix(double[,] inputArray)
{
input = inputArray;
}
public IEnumerator<double> GetEnumerator()
{
return (IEnumerator<double>)input.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return input.GetEnumerator();
}
}
主要方法:
static void Main(string[] args)
{
var m = new Matrix(new double[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } });
}
我希望这可以帮到你!
答案 2 :(得分:0)
而不是从IEnumerable
派生我会使用属性:
class Matrix
{
public double[,] Arr { get; set; }
}
Matrix m = new Matrix
{
Arr = new double [,] { {1d,2d,3d}, { 4d,5d, 6d}}
};