2010-04-06 88 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

可以使用嵌套「來自」語句。因此使用代表表格內相應的列/行位置的範圍變量遍歷整個數組。對於每個數字,您都希望檢查它是否在其行內或列內有新的最大值。