2010-04-06 21 views
5

Có cách nào để sử dụng LINQ để thu được tối đa của mỗi cột cho mảng hai chiều không?Sử dụng LINQ để lấy được tối đa các cột cho hai mảng chiều

Giả sử rằng tôi có như sau:

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

Tôi muốn nhận được tối đa arrays[0,:], arrays[1,:] .... arrays[4,:]. Làm thế nào để sử dụng LINQ để làm điều đó?

tôi có thể có sử dụng phương pháp như vậy

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; 
} 

Nhưng tôi muốn một cách gọn gàng hơn để làm việc.

Trả lời

5

Tôi cho rằng bạn luôn có thể sử dụng Enumerable.Range như một hình thức nhỏ gọn của truy cập được lập chỉ mục:

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

Và nếu bạn muốn có được điều này cho tất cả hàng:

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

Tôi không nghĩ rằng có một cách tích hợp để có được một hàng từ một mảng đa chiều. Bạn có thể viết một phương pháp mở rộng mặc dù:

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]; 
    } 
} 

Và sau đó chỉ cần sử dụng "bình thường" LINQ:

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

LINQ không có bất kỳ phương pháp bao gồm các mảng đa chiều.

Tuy nhiên, nếu bạn có thể chuyển đổi danh sách thành danh sách hoặc có thể là tiện ích mở rộng của riêng bạn.

0

Bạn có thể sử dụng lồng nhau "từ" báo cáo. Vì vậy, lặp qua toàn bộ mảng với các biến phạm vi đại diện cho vị trí col/hàng tương ứng trong bảng. Đối với mỗi số, bạn muốn kiểm tra xem nó có phải là giá trị tối đa mới trong hàng của nó hay trong cột của nó.

Các vấn đề liên quan