2009-02-09 32 views
2

我正在研究存儲二維數組類MyType的類,並希望它使用動態數據類型。即不是MyType[,]C#的動態二維結構#

MyType[,]的問題是,類不提前知道數組的大小,我不想去管理數組重新調整大小的麻煩,如果它已在別處完成在.NET框架中。

該類在任何給定時刻都不知道最大數組大小,但數組將會很密集。我知道我可以使用靜態數組,並根據需要重新分配內存,但如果可能的話,我寧願使用內置的實現。

爲此目的,有沒有比List<List<MyType>>更好的東西?

編輯1:指定數組是密集的;

編輯2和3:指定問題MyType[,]

+0

這將有助於界定「更好的」 :) – 2009-02-09 09:42:04

+0

更好地符合我的需要。我希望在性能和不重新發明輪子之間取得明智的平衡。謝謝。 – biozinc 2009-02-09 09:57:22

回答

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

這取決於你的結構將如何稀疏是。例如,如果您的輸入與myTypes[0, 1]myTypes[134, 544]類似,那麼使用sparse matrix會更好。否則,List<List<MyType>>會做。

1

對於稠密的二維矩陣,矩形陣列是理想的。 SomeType[,]有什麼問題?請注意,您可以創建動態數組要麼Array.CreateInstance(type, dim0Size, dim1Size),或者使用泛型:

void DoWork<T>(...) { 
    T[,] data = ... 
} 
DoWork<Foo>(...); 
DoWork<Bar>(...); 

(可能使用MakeGenericMethod如果你想使用點對點類型)