良好的一天,自由長度2D陣列,如何聲明在c#
通常我創建2D陣列如下:
string [,] arr = new string [9,4];
這與9行和4列的2D陣列。
我想問一下,如何創建任意長度的二維數組。 例如,將行設置爲9並不是祕密,它可以是任何數字,取決於情況。
良好的一天,自由長度2D陣列,如何聲明在c#
通常我創建2D陣列如下:
string [,] arr = new string [9,4];
這與9行和4列的2D陣列。
我想問一下,如何創建任意長度的二維數組。 例如,將行設置爲9並不是祕密,它可以是任何數字,取決於情況。
簡單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) {
....
}
}
對於您必須使用List<List<string>>
實例。現在,您可以動態添加任何您想要的內容,但是,如果您已達到最大行數或列數,則您還需要自行檢查數組格式,這也有缺點。
這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;
}
}
雖然可以增加更多的實用程序,以方便您的工作流程。
這是MATLAB稀疏矩陣的一個漂亮的c#轉換。 –
@AdrienPlisson這是一件好事還是壞事? (我從90年代起就沒有使用過MATLAB。) –
這是一件特殊的事情:稀疏矩陣有其用處,但用戶必須意識到稀疏矩陣的缺點。優點:內存很少,數據量非常大的小內存佔用,缺點:如果矩陣並不稀疏,可怕的膨脹! –
因爲你正在包裝這個東西,如果只有一個單一的列表大小爲x * y,並且在訪問元素時計算正確的偏移量是不是更具有內存效率? –
migajek
*可能是*是的,但您花費更多時間遍歷該列表,以便從給定的*行*和*列*中選擇所需的(如果需要)值。而且很難管理,特別是在矩陣不對稱的情況下。 – Tigran