我正在处理一个存储类MyType
的2D数组的类,并希望它使用动态数据类型。即不是MyType[,]
MyType[,]
的问题是该类提前不知道数组的大小,如果在其他地方已经完成,我不想去管理数组重新调整大小的麻烦在.NET框架中。
在任何给定时刻,类都不知道最大数组大小,但数组将是密集的。我知道我可以使用静态数组,并根据需要重新分配内存,但如果可能的话,我更愿意使用内置实现。
为此目的,有没有比List<List<MyType>>
更好的东西?
编辑1:指定该数组是密集的;
编辑2和3:MyType[,]
答案 0 :(得分:4)
创建自己的List<List<T>>
封装,如:
public class Matrix<T>
{
List<List<T>> matrix;
public void Add(IEnumerable<T> row)
{
List<T> newRow = new List<T>(row);
matrix.Add(newRow);
}
public T this[int x, int y]
{
get { return matrix[y][x]; }
}
....
}
定义你自己的一组操作!是免费的!
通过封装它,您可以决定稍后进行更优化的实施,如果这还不够。
ICollection<T> rowOne = (ICollection<T>)new List<Int64>();
rowOne.Add(1);
rowOneList.Add(2);
rowOne.Add(3);
ICollection<T> rowTwo = (ICollection<T>)new List<Int64>();
rowTwo .Add(4);
rowTwo .Add(5);
rowTwo .Add(6);
答案 1 :(得分:1)
这取决于你的结构有多稀疏。例如,如果您的条目类似于myTypes[0, 1]
和myTypes[134, 544]
,那么使用sparse matrix会更好。否则,List<List<MyType>>
会这样做。
答案 2 :(得分:1)
对于密集的2D矩阵,矩形阵列是理想的。您对SomeType[,]
有什么问题?请注意,您可以使用Array.CreateInstance(type, dim0Size, dim1Size)
或使用泛型创建动态数组:
void DoWork<T>(...) {
T[,] data = ...
}
DoWork<Foo>(...);
DoWork<Bar>(...);
(如果你想使用ad-hoc类型,可能会使用MakeGenericMethod
)