2010-04-01 3 views
16

У меня есть задача, когда мне нужно перевести DataTable в двумерный массив. Это достаточно просто сделать, просто перейдя по строкам и столбцам (см. Пример ниже).Выбор многомерного массива в 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; 
} 

Что бы я хотел сделать, это использовать оператор select в LINQ для создания этого 2D-массива. К сожалению, похоже, что в LINQ нет способа выбрать многомерный массив. Да, я знаю, что я могу использовать LINQ для выбора массива с зазубринами, но это не то, что я хочу.

Является ли мое предположение правильным, или есть способ использовать LINQ для выбора многомерного массива?

+0

Вместо этого вы можете сделать массив массивов? (было бы быстрее преобразовать) –

+0

Да, я могу сделать зубчатый массив (массив массивов), но, к сожалению, в этом случае это не то, что api, к которому я звонил, согласился бы. – mckhendry

ответ

15

Я не думаю, что это возможно. Мои рассуждения в том, что Select и большинство других функций LINQ требуют, чтобы коллекции они работают по реализации, по крайней мере IEnumerable<T> для некоторого Т:

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

прямоугольный массив не реализует IEnumerable<T> для любого T, поэтому он не может быть возвращаемое значение функции Select.

+2

Да, тривиально получить зубчатый массив с использованием LINQ, но истинный 2D-массив - это нечто совсем другое. –

Смежные вопросы