在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?)谢谢你的帮助!
发布于 2012-03-06 19:07:24
您不能传递矩形数组的行,您必须使用交错数组(数组的数组):
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)
发布于 2014-05-02 13:49:17
更新:正如Jon Skeet正确地指出的那样,这不提供对行的引用,而是创建一个新的副本。如果您的代码需要更改行,则此方法不起作用。我重命名了该方法,以使这一点变得清晰。
更新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));
}
https://stackoverflow.com/questions/9590144
复制相似问题