2010-04-06 11 views
5

Czy istnieje jeszcze możliwość użycia LINQ do uzyskania maksymalnej liczby kolumn dla tablic dwuwymiarowych?Używanie LINQ do uzyskania maksimum kolumn dla tablic dwuwymiarowych

Załóżmy, że mam następujące:

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

Chcę uzyskać maksymalnie arrays[0,:], arrays[1,:] .... arrays[4,:]. Jak korzystać z LINQ, aby to zrobić?

mógłbym użyć takiego sposobu

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

Ale wolałbym bardziej zwięzłych sposobów robienia rzeczy.

Odpowiedz

5

Przypuszczam, zawsze można użyć Enumerable.Range jako zwartej formie indeksowanego dostępu:

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

A jeśli chcesz dostać to dla wszystkich wierszy:

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

Nie sądzę, że istnieje wbudowany sposób na uzyskanie rzędu z tablicy wielowymiarowej. Można napisać metodę rozszerzenia choć:

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

A potem po prostu korzystać z „normalną” LINQ:

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

LINQ nie ma żadnych metod, które zakrywają tablice wielowymiarowe.

Jednak jeśli możesz przekonwertować go na listę, lub może rozwinąć własne rozszerzenia.

0

można użyć zagnieżdżone "z" wypowiedzi. W ten sposób następuje iteracja przez całą tablicę ze zmiennymi odległościowymi reprezentującymi odpowiednie położenie kolumny/wiersza w tabeli. Dla każdej liczby chcesz sprawdzić, czy jest to nowy max w swoim wierszu lub w jego kolumnie.

Powiązane problemy