2012-03-06 58 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