2012-03-06 93 views
8

在C#編程語言中,如何傳遞一個多維數組的行?例如,假設我有以下幾點:多維數組的C#行

int[,] foo; 
foo = new int[6,4]; 
int[] least; 
least = new int[6]; 

for(int i = 0; i < 6; i++) 
{ 
    least[i] = FindLeast(ref foo[i]);  //How do I pass the ith row of foo??? 
} 

而且,任何人都可以向我解釋其在C#中的矩形和鋸齒排列的好處?這是否會出現在其他流行的編程語言中? (Java?) 感謝您的幫助!

回答

8

你不能傳遞一個矩形陣列的行,你必須使用一個交錯數組(數組的數組):如果你覺得那麼討厭使用

int[][] foo = new int[6][]; 

for(int i = 0; i < 6; i++) 
    foo[i] = new int[4]; 

int[] least = new int[6]; 

for(int i = 0; i < 6; i++) 
    least[i] = FindLeast(foo[i]); 

編輯
鋸齒狀排列,急需一個長方形,一個簡單的技巧,將節省您:

int FindLeast(int[,] rectangularArray, int row) 
+0

我可以將矩形數組傳遞給接受鋸齒狀數組的函數嗎? – CodeKingPlusPlus 2012-03-06 19:13:00

+1

@CodeKingPlusPlus:不,你不能 – BlackBear 2012-03-06 19:22:34

+0

所以基本上這不是一個解決方案:) – 2014-05-02 13:37:25

4

你沒有,這樣的rectangular array。這是一個單一的對象。

相反,你需要使用一個jagged array,像這樣:

// Note: new int[6][4] will not compile 
int[][] foo = new int[6][]; 
for (int i = 0; i < foo.Length; i++) { 
    foo[i] = new int[4]; 
} 

然後你可以通過每個 「子」 - 陣列:

int[] least = new int[foo.Length]; 
for(int i = 0; i < 6; i++) 
{ 
    least[i] = FindLeast(foo[i]); 
} 

注意,有沒有必要通過foo[i]通過引用通過,也是一個好主意,當你可以的時候,在聲明點分配局部變量值。 (它使你的代碼更緊湊,更容易理解。)


如果你不知道這一點,你可能想閱讀parameter passing in C#我的文章。

+0

你按秒打我! :P – BlackBear 2012-03-06 19:08:32

+0

我可以傳遞一個矩形陣列作爲鋸齒陣列嗎? – CodeKingPlusPlus 2012-03-06 19:10:25

+1

對我而言,這看起來像是一個非解決方案。在矩形陣列的情況下可以做些什麼? – 2014-05-02 13:38:26

-1

更新:作爲喬恩斯基特正確地指出,這並不非p將參考提供給該行,而是創建新副本。如果您的代碼需要更改一行,此方法不起作用。我已經重新命名了這個方法來說明這一點。

更新2:如果你想能夠編輯的字段,並且有變化發生在父陣列,也可以使用包裝我this library I maed提供。結果行foo.Row(i)不是數組,而是實現IList,所以如果您需要需要來傳遞數組,這也不是解決方案。


此擴展方法將允許您爲行查詢多維數組。應該注意的是,這是計算量很大(不是有效),如果有可能您應該對這些情況使用鋸齒陣列。但是,如果您發現自己處於不能使用鋸齒狀陣列的情況,這可能會有用。

public static T[] CopyRow<T>(this T[,] arr, int row) 
{ 
    if (row > arr.GetLength(0)) 
     throw new ArgumentOutOfRangeException("No such row in array.", "row"); 

    var result = new T[arr.GetLength(1)]; 
    for (int i = 0; i < result.Length; i++) 
    { 
     result[i] = arr[row, i]; 
    } 
    return result; 
} 

你的代碼可以改寫:

int[,] foo; 
foo = new int[6,4]; 
int[] least; 
least = new int[6]; 

for(int i = 0; i < 6; i++) 
{ 
    least[i] = FindLeast(ref foo.CopyRow(i)); 
} 
+0

雖然這是複製數組的內容,這不會做同樣的事情。特別是,如果'FindLeast' *修改*數組,那麼修改將不會在結果中可見。另外,'foo.Row(i)'的結果沒有被分類爲變量,所以代碼不會被編譯。你只是*不能*把一個矩形數組看作是一個鋸齒形數組 - 數組就不能像這樣工作。 – 2014-05-02 13:53:10

+0

我不明白你對編譯的評論。代碼運行並編譯。 – 2014-05-02 13:55:12

+0

你是對的!這不會傳遞對一行的引用(無法完成)。假設'FindLeast'不修改行,這應該工作。我將重新命名該方法,但:) :) – 2014-05-02 13:56:14