我正在创建一个Matrix类,也想让构造函数也输入Matrix类型。如何初始化特定类型的2d数组?
public class Matrix
{
public int[][] matrix;
//??
Matrix(int x,int y,string type)
{
switch (type)
{
case "int":
//initialize a int 2d array
case "double":
//initialize a double 2d array
case "float":
//initialize a float 2d array
default:
//initialize a float 2d array
break;
}
}
}
答案 0 :(得分:4)
如果可以在设计时声明类型,则约束为new
的泛型可能会有所帮助
public class Matrix<T> where T : new()
{
public T[][] matrix;
public Matrix(int x, int y)
=> matrix = Enumerable.Range(0,x).Select(elem => new T[y]).ToArray();
}
用法
var something = new Matrix<int>(4,4);
答案 1 :(得分:0)
标准方法是使用泛型而不是类似Matrix<T>
这样的字符串名称。
如果要在运行时将类型指定为字符串,则必须添加多个字段来存储数组的每种类型,或者使用dynamic
或object
作为数组的类型(因为无法将float[][]
分配给类型int[][]
的字段。
对于非性能敏感的代码,我将与dynamic
一起使用,因为它将为您提供看起来合理的代码(您失去了智能感知和编译时的安全性),并且无论如何都会在运行时验证所有操作。
public class Matrix
{
dynamic matrix;
Matrix(int x,int y,string type)
{
switch (type)
{
case "int":
matrix =
Enumerable.Repeat(0, x).Select(_ => new int[y]).ToArray();
break;
case "double":
//initialize a double 2d array
matrix =
Enumerable.Repeat(0, x).Select(_ => new double[y]).ToArray();
break;
case "float":
default:
//initialize a float 2d array
matrix =
Enumerable.Repeat(0, x).Select(_ => new float[y]).ToArray();
break;
}
}
}
有关数组初始化,请参见Multidimensional Array问题。
答案 2 :(得分:0)
查看generics
public class Matrix<T>
{
public T[,] matrix;
public Matrix<T>(int x, int y)
{
matrix = new T[x, y];
}
}
您可能会在互联网上的某个地方找到经过测试的现有Matrix类。