2010-04-06 7 views
5

Esiste comunque l'uso di LINQ per ottenere il massimo di ciascuna colonna per gli array bidimensionali?Utilizzo di LINQ per ottenere max di colonne per array bidimensionali

Si supponga che ho il seguente:

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

voglio ottenere il massimo di arrays[0,:], arrays[1,:] .... arrays[4,:]. Come usare LINQ per farlo?

avrei potuto utilizzare tale metodo

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

ma io preferirei un modi più succinta di fare le cose.

risposta

5

Suppongo che si può sempre utilizzare Enumerable.Range come una forma compatta di accesso indicizzato:

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

E se si desidera ottenere questo per tutti righe:

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

Non penso che ci sia un modo integrato per ottenere una riga da una matrice multidimensionale. È possibile scrivere un metodo di estensione però:

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

E poi basta usare "normale" LINQ:

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

LINQ non ha metodi che coprono gli array multidimensionali.

Tuttavia, se è possibile convertirlo in un elenco, o forse eseguire il roll-proprio estensioni.

0

È possibile utilizzare nidificato "da" dichiarazioni. Quindi scorrere l'intera matrice con variabili di intervallo che rappresentano la rispettiva posizione di colonna/riga all'interno della tabella. Per ciascuno dei numeri, si desidera verificare se si tratta di un nuovo massimo all'interno della sua riga o all'interno della sua colonna.

Problemi correlati