2013-06-25 82 views
1

良好的一天,自由長度2D陣列,如何聲明在c#

通常我創建2D陣列如下:

string [,] arr = new string [9,4]; 

這與9行和4列的2D陣列。

我想問一下,如何創建任意長度的二維數組。 例如,將行設置爲9並不是祕密,它可以是任何數字,取決於情況。

回答

4

簡單List<List<T>>

這就像一個概念,你自然可以把它包裝在你的自定義類中,所以API的使用者看不到這些wiered嵌套聲明。

public class Matrix { 

    private mtx = new List<List<T>>(); 


    public void Append(T value) { 
     ..... 
    } 

    public void InsertAt(T value, int row, int column) { 
     .... 
    } 

} 
+0

因爲你正在包裝這個東西,如果只有一個單一的列表大小爲x * y,並且在訪問元素時計算正確的偏移量是不是更具有內存效率? – migajek

+0

*可能是*是的,但您花費更多時間遍歷該列表,以便從給定的*行*和*列*中選擇所需的(如果需要)值。而且很難管理,特別是在矩陣不對稱的情況下。 – Tigran

2

對於您必須使用List<List<string>>實例。現在,您可以動態添加任何您想要的內容,但是,如果您已達到最大行數或列數,則您還需要自行檢查數組格式,這也有缺點。

0

Matrix類是空間(基於訪問模式)和性能高效:

class Matrix<T> 
{ 
    readonly Dictionary<int, Dictionary<int, T>> _rows = new Dictionary<int, Dictionary<int, T>>(); 

    public T this[int i, int j] 
    { 
     get 
     { 
      var row = ExpandOrGet(j); 
      if (!row.ContainsKey(i)) row[i] = default(T); 

      UpdateSize(i, j); 

      return row[i]; 
     } 
     set 
     { 
      ExpandOrGet(j); 
      _rows[j][i] = value; 

      UpdateSize(i, j); 
     } 
    } 

    void UpdateSize(int i, int j) 
    { 
     if (j > SizeRows) SizeRows = j; 
     if (i > SizeColums) SizeColums = i; 
    } 

    public int SizeRows { get; private set; } 
    public int SizeColums { get; private set; } 

    Dictionary<int, T> ExpandOrGet(int j) 
    { 
     Dictionary<int, T> result = null; 

     if (!_rows.ContainsKey(j)) 
     { 
      result = new Dictionary<int, T>(); 
      _rows[j] = result; 
     } 
     else result = _rows[j]; 

     return result; 
    } 
} 

雖然可以增加更多的實用程序,以方便您的工作流程。

+0

這是MATLAB稀疏矩陣的一個漂亮的c#轉換。 –

+0

@AdrienPlisson這是一件好事還是壞事? (我從90年代起就沒有使用過MATLAB。) –

+0

這是一件特殊的事情:稀疏矩陣有其用處,但用戶必須意識到稀疏矩陣的缺點。優點:內存很少,數據量非常大的小內存佔用,缺點:如果矩陣並不稀疏,可怕的膨脹! –