2010-04-01 14 views
16

Ich habe eine Aufgabe, bei der ich eine DataTable in ein zweidimensionales Array umwandeln muss. Das ist einfach genug, indem Sie einfach die Zeilen und Spalten durchlaufen (siehe Beispiel unten).Auswählen eines mehrdimensionalen Arrays in 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; 
} 

Was ich wirklich tun möchte, ist eine SELECT-Anweisung in LINQ, um diese 2D-Array zu generieren. Leider scheint es in LINQ keine Möglichkeit zu geben, ein mehrdimensionales Array auszuwählen. Ja, mir ist klar, dass ich mit LINQ ein gezacktes Array auswählen kann, aber das möchte ich nicht.

Ist meine Annahme korrekt, oder gibt es eine Möglichkeit, LINQ zu verwenden, um ein mehrdimensionales Array auszuwählen?

+0

Können Sie stattdessen ein Array von Arrays erstellen? (es wäre schneller zu konvertieren) –

+0

Ja, ich kann eine gezackte Array (Array von Arrays), aber leider in diesem Fall ist das nicht, was die API, die ich anruft, würde akzeptieren. – mckhendry

Antwort

15

Ich glaube nicht, dass es möglich ist. Meine Argumentation ist, dass Select und die meisten anderen LINQ-Funktionen erfordern, dass die Sammlungen sie auf mindestens IEnumerable<T> für einige T implementieren arbeiten:

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

Eine rechteckige Anordnung nicht implementiert IEnumerable<T> für jedes T, so dass es nicht das sein kann Rückgabewert einer Select-Funktion.

+2

Ja, es ist trivial, mit LINQ ein gezacktes Array zu erhalten, aber ein echtes 2D-Array ist etwas ganz anderes. –

Verwandte Themen