2010-04-06 36 views
5

是否有任何使用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; 
} 

但我宁愿做事情的更简洁的方式。

回答

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(); 
} 
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(); 
0

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

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

0

可以使用嵌套“来自”语句。因此使用代表表格内相应的列/行位置的范围变量遍历整个数组。对于每个数字,您都希望检查它是否在其行内或列内有新的最大值。