2010-04-01 10 views
16

Tengo una tarea en la que necesito traducir una tabla de datos a una matriz bidimensional. Eso es bastante fácil de hacer simplemente haciendo un bucle sobre las filas y las columnas (ver ejemplo a continuación).Seleccionar una matriz multidimensional en LINQ

private static string[,] ToArray(DataTable table) 
{ 
    var array = new string[table.Rows.Count,table.Columns.Count]; 

    for (int i = 0; i < table.Rows.Count; ++i) 
     for (int j = 0; j < table.Columns.Count; ++j) 
      array[i, j] = table.Rows[i][j].ToString(); 

    return array; 
} 

Lo que realmente me gustaría hacer es utilizar una instrucción de selección en LINQ para generar esa matriz en 2D. Desafortunadamente, parece que no hay forma de que LINQ seleccione una matriz multidimensional. Sí, soy consciente de que puedo usar LINQ para seleccionar una matriz dentada, pero eso no es lo que quiero.

¿Mi suposición es correcta o hay alguna forma de utilizar LINQ para seleccionar una matriz multidimensional?

+0

¿Podría hacer una matriz de matrices en su lugar? (Sería más rápido de convertir) –

+0

Sí, puedo hacer una matriz dentada (matriz de matrices), pero desafortunadamente en este caso no es lo que la API que estaba llamando aceptaría. – mckhendry

Respuesta

15

No creo que sea posible. Mi razonamiento es que Select y la mayoría de otras funciones LINQ requieren que las colecciones que trabajan en implementar al menos para algunos IEnumerable<T> T:

public static IEnumerable<TResult> Select<TSource, TResult>(
    this IEnumerable<TSource> source, 
    Func<TSource, TResult> selector 
) 

una matriz rectangular no implementa IEnumerable<T> para cualquier T por lo que no puede ser el valor de retorno de una función Seleccionar.

+2

Sí, es trivial obtener una matriz dentada utilizando LINQ, pero una verdadera matriz 2D es algo completamente diferente. –

Cuestiones relacionadas