2010-04-06 12 views
5

¿Hay alguna forma de utilizar LINQ para obtener el máximo de cada columna para dos matrices dimensionales?Uso de LINQ para obtener el máximo de columnas para matrices bidimensionales

Supongamos que tengo el siguiente:

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

que quieren obtener el máximo de arrays[0,:], arrays[1,:] .... arrays[4,:]. ¿Cómo usar LINQ para hacerlo?

que podría tener el uso de estos métodos

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

Pero yo preferiría una manera más sucintas de hacer las cosas.

Respuesta

5

supongo que siempre se puede utilizar Enumerable.Range como una forma compacta de acceso indexado:

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

Y si quieres conseguir esto para todos filas:

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

No creo que haya una forma incorporada de obtener una fila de una matriz multidimensional. Se puede escribir un método de extensión embargo:

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

Y a continuación, sólo tiene que utilizar "normal" LINQ:

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

LINQ no tiene ningún métodos que cubren matrices multidimensionales.

Sin embargo, si puede convertirlo en una lista, o tal vez extender sus propias extensiones.

0

Puede utilizar anidado declaraciones "de". De este modo, itere a través de la matriz completa con variables de rango que representan la posición col/row respectiva dentro de la tabla. Para cada uno de los números, desea verificar si es un nuevo máximo dentro de su fila o dentro de su columna.

Cuestiones relacionadas