c # - LINQ Auswahl aus Sammlung

8

Ich versuche, eine einfache Select -Methode für eine Klasse zu schreiben, die von IList erbt.

%Vor%

Einige Probleme, die ich habe:

Erstens:

  • VS2010 meldet Cannot implicitly convert type 'IEnumerable<RowData>' to 'List<RowData>'. An explicit conversion exists (are you missing a cast?)

OK, wohin geht der CAST?

Zweitens:

  • Jemand könnte einen ungültigen colName -Wert (d. h. String.IsNullOrEmpty(colName) ) oder einen Null-Parameter (object value == null) .
  • übergeben

Wie würde ich mit der Rückgabe meiner Funktion umgehen, wenn die Eingabeparameter ungültig sind?

[Gelöst]

Ich habe meine Select -Anweisung bearbeitet (sogar umbenannt). Ich musste einen Schalter verwenden, um zu dem Datentyp zu konvertieren, in dem sich die Daten befanden, aber es funktioniert.

%Vor%

[Gelöst (kurze Version)]

Jon Skeet hat dies etwa zur gleichen Zeit gepostet, als ich meine Lösung gepostet habe, und (wie immer) ist sein Code viel schöner.

%Vor%

@Jon Skeet: Wenn ich jemals dein Gesicht in derselben Zeile bei irgendeiner Softwareentwicklerposition sehe, für die ich mich bewerbe, werde ich mich einfach umdrehen und nach Hause gehen.

@Everyone : Danke für die Hilfe!

    
jp2code 12.07.2011, 16:56
quelle

4 Antworten

10

Das Ergebnis einer solchen Abfrage ist kein List<T> , sondern ein IEnumerable<T> . Wenn Sie das in ein List<T> konvertieren möchten, rufen Sie einfach ToList :

auf %Vor%

Zufällig rufen Sie nur Where in Ihrer Abfrage an. Ich würde dies wie folgt umschreiben:

%Vor%

Ich würde die Methode auch in etwas umbenennen, das offensichtlich filtert anstatt projizieren , da letzteres die gebräuchlichere Verwendung des Ausdrucks "select" ist LINQ.

Wie für Eingabeparameter - ich schlage vor, Sie validieren die Argumente und werfen eine Ausnahme, wenn sie nicht gültig sind:

%Vor%     
Jon Skeet 12.07.2011, 16:58
quelle
1

Sie erhalten die Fehlermeldung, da LINQ-Abfragen IEnumerable und nicht List zurückgeben.

Wenn Sie eine Liste benötigen, ist es einfach:

%Vor%     
Justin Niessner 12.07.2011 16:58
quelle
1

Sie können eine IEnumerable<RowData> nicht direkt auf eine List<RowData> umwandeln, es gibt jedoch eine Convenience-Funktion Enumerable.ToList<T>() , die wie folgt verwendet wird:

%Vor%

Wie bei Ihrer zweiten Frage würde beim Aufruf von ToList() eine Ausnahme auftreten, da der LINQ-Ausdruck sofort ausgewertet wird. Sie haben einige Optionen, einschließlich ArgumentException s zu werfen oder eine leere Liste zurückzugeben. Es hängt von Ihren Anwendungsfällen ab. Ich würde vorschlagen, einfach eine Ausnahme zu werfen (vorausgesetzt, Sie haben eine HasColumn() -Methode für Ihre RowData -Klasse):

%Vor%

Ein anderer Ansatz, falls eine Spalte fehlt, ist nicht unbedingt ein "Problem":

%Vor%     
user7116 12.07.2011 16:58
quelle
-1

Sie müssen IQueriable & lt; & gt; List & lt; & gt; durch Aufrufen von ToList ();

%Vor%     
Alexander Beletsky 12.07.2011 16:58
quelle

Tags und Links