2011-08-22 156 views
3

我有對象的2維數組的二維數組,我初始化採用傳統的循環:初始化對象

PairDS[,] tempPb1 = new PairDS[LoopCounterMaxValue+1, LoopCounterMaxValue+1]; 
for (int i = 0; i <= LoopCounterMaxValue; i++) 
    for (int j = 0; j <= LoopCounterMaxValue; j++) 
     tempPb1[i, j] = new PairDS(); 

有沒有更好的方式來做到這一點使用可枚舉的東西?

+1

這種方式有什麼不好? – Alxandr

+0

什麼也沒有,但看起來很冗長。 –

回答

1

我認爲Initialize可以做到這一點,但它只適用於值類型。

int N = 10; 
PairDS[,] temp = new PairDS[N + 1, N + 1]; 
temp.Initialize(); 

我建議你做的是使用鋸齒陣列。

class PairDS { public PairDS(int row, int col) { } } 


static void Main(string[] args) 
{ 
    int N = 10; 
    PairDS[][] temp = Enumerable.Range(0, N + 1).Select(
     (row) => Enumerable.Range(0, N + 1).Select(
      (col) => new PairDS(row, col)).ToArray()).ToArray(); 
} 
+0

是的鐵血陣列是另一個想法考慮的好主意。謝謝你的合作。 – user906763

1

我不相信你可以將多維數組表示爲Enumerable或List,因爲它(CLR)無法知道你打算如何索引數組。

如果你一行一行地完成它,它實際上會變得更糟(即更慢),然後簡單地循環訪問數組,並像初始化每個單元格一樣。

1

沒有辦法用Enumerable類型直接初始化二維數組,因爲有些用戶指出,你在做什麼沒有什麼直接的錯誤。如果你只是想簡化循環,儘管這可能是你正在尋找的;

const int length = LoopCounterMaxValue + 1; 
PairDS[,] tempPb1 = new PairDS[length, lenth]; 
for (var i = 0; i < length * length; i++) { 
    var column = i % length; 
    var row = (i - column)/length; 
    tempPb1[row, column] = new PairDS(); 
} 
+2

這些操作%,/,*不會簡化,需要更多的時間來了解正在發生的事情...... –

+0

@archer我認爲這是關於視角。我爲一個人找到更容易閱讀的原因,因爲我已經使用過並且看過很多次。我確信一眼就不是那麼簡單。 OP的問題並不清楚他們的意圖,我想通過刪除嵌套來提供簡化 – JaredPar