C#的动态2D结构

时间:2009-02-09 09:36:48

标签: c# dynamic-data

我正在处理一个存储类MyType的2D数组的类,并希望它使用动态数据类型。即不是MyType[,]

MyType[,]的问题是该类提前不知道数组的大小,如果在其他地方已经完成,我不想去管理数组重新调整大小的麻烦在.NET框架中。

在任何给定时刻,类都不知道最大数组大小,但数组将是密集的。我知道我可以使用静态数组,并根据需要重新分配内存,但如果可能的话,我更愿意使用内置实现。

为此目的,有没有比List<List<MyType>>更好的东西?

编辑1:指定该数组是密集的;

编辑2和3:MyType[,]

指定的问题

3 个答案:

答案 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