使用LINQ获取二维数组的最大列数

时间:2010-04-06 04:24:54

标签: c# linq

无论如何使用LINQ获取二维数组的每列最大值?

假设我有以下内容:

var arrays = new double[5,100]();

我想获得arrays[0,:]arrays[1,:] .... arrays[4,:]的最大值。如何使用LINQ来做到这一点?

我可以使用这样的方法

public double GetMax(double[,] arr, int rowIndex)
{
   var colCount = arr.GetLength(1);
   double max = 0.0;
   for(int i=0; i<colCount; i++)
   {
      max=Math.Max(Math.Abs(arr[rowIndex, i]), max);
   }
   return max;
}

但我更喜欢更简洁的做事方式。

4 个答案:

答案 0 :(得分:5)

我想你总是可以使用Enumerable.Range作为索引访问的紧凑形式:

public static double GetMax(double[,] arr, int rowIndex)
{
    return (from col in Enumerable.Range(0, arr.GetLength(1))
            select arr[rowIndex, col]).Max();
}

如果您想为所有行获取此内容:

public static double[] GetMaxForAllRows(double[,] arr, int rowIndex)
{
    return (from row in Enumerable.Range(0, arr.GetLength(0))
            let cols = Enumerable.Range(0, arr.GetLength(1))
            select cols.Max(col => arr[row, col])).ToArray();
}

答案 1 :(得分:3)

我认为没有一种从多维数组中获取行的内置方法。您可以编写扩展方法:

public static IEnumerable<T> Row<T>(this T[,] array, int rowIndex)
{
    var colCount = array.GetLength(1);
    for(int i=0; i<colCount; i++)
    {
        yield return arr[rowIndex, i];
    }
}

然后只使用“普通”LINQ:

var max = array.Row(i).Max();

答案 2 :(得分:0)

LINQ没有任何涵盖多维数组的方法。

但是,如果您可以将其转换为列表,或者可以滚动您自己的扩展名。

答案 3 :(得分:0)

您可以使用嵌套的“from”语句。因此,使用表示表中相应col / row位置的范围变量遍历整个数组。对于每个数字,您希望检查其行内或列中是否为新的最大值。