2012-08-12 85 views
0

我想創建一個特定類型的鋸齒狀數組,然後根據數組中兩個項目之間的比較創建另一個數組。如何比較鋸齒陣列中的項目?

例如:

int[][] arr = new int[][] 
{ 
    new int[] {1,3,5,7,9}, 
    new int[] {0,2,4,6}, 
    new int[] {11,22}, 
    new int[] {0,2,4,6} 
}; 

int[][] arrResult = new int[arr.GetUpperBound(0)][]; 

for (int i = 0; i < arr.GetUpperBound(0); i++) 
{ 
    for (int j = 0; j < arr[i].Length; j++) 
    { 
     arrResult[i][j] = arr[i][j] + arr[i + 1][j]; 
    } 
} 

我不知道怎麼說,如果不設i + 1,則跳過比較。還是有更好的方法來做到這一點?

編輯

通過比較我的意思是我想從後列彼此而來的陣列從訪問兩個項目,做一些與他們創造一個進入一個新的數組(結構相同)產品。

+0

'基於兩項之間的比較'哪些項目? – 2012-08-12 15:55:00

+0

在這個例子中,我只是將arr [i] [j]和arr [i + 1] [j]加在一起創建arrResult [i] [j],但我想找到一種技術讓我可以比較更多數組中的複雜項目,然後從比較中生成一個新數組。 – 2012-08-12 16:02:54

+0

1)你不*比較*任何東西。 2)什麼是規則,拿起兩個項目*添加* – 2012-08-12 16:07:04

回答

2

你沒有比較,但添加。所以目前還不清楚你真的想做什麼。

如果你想在連續兩行對應的項目執行操作時,你只能在兩排

for (int i = 0; i < arr.Length - 1); i++) { 
    for (int j = 0; j < arr[i].Length && j < arr[i + 1].Length; j++) { 
     arrResult[i][j] = arr[i][j] + arr[i + 1][j]; 
    } 
} 
+0

按照svick的建議,我用'Length - 1'取代了'GetUpperBound()'。 – 2012-08-12 18:14:32

2

第一的最小長度這麼做,你不需要GetUpperBound()這裏。這對於多維數組(非基於0的數組)非常有用,而不是參差不齊的數組。相反,您可以使用Length - 1。其次,您需要創建要分配給的數組。 new int[count][]不會創建嵌套數組,因此您的代碼會拋出NullReferenceException

第三,你想限制索引(和創建的數組的大小)的兩個尺寸中較小的一個。你可以使用Math.Min()

放在一起:

int[][] arrResult = new int[arr.Length - 1][]; 

for (int i = 0; i < arr.Length - 1; i++) 
{ 
    int length = Math.Min(arr[i].Length, arr[i+1].Length); 
    arrResult[i] = new int[length]; 

    for (int j = 0; j < length; j++) 
    { 
     arrResult[i][j] = arr[i][j] + arr[i + 1][j]; 
    } 
} 

第四,作爲替代,你可以使用LINQ Zip()(它會通過短陣限制結果的大小照顧):

int[][] arrResult = new int[arr.Length - 1][]; 

for (int i = 0; i < arr.Length - 1; i++) 
{ 
    arrResult[i] = arr[i].Zip(arr[i+1], (a, b) => a + b).ToArray(); 
}