Ich versuche, eine einfache Select
-Methode für eine Klasse zu schreiben, die von IList
erbt.
Einige Probleme, die ich habe:
Erstens:
Cannot implicitly convert type 'IEnumerable<RowData>' to 'List<RowData>'. An explicit conversion exists (are you missing a cast?)
OK, wohin geht der CAST?
Zweitens:
colName
-Wert (d. h. String.IsNullOrEmpty(colName)
) oder einen Null-Parameter (object value == null)
. 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.
[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!
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
:
Zufällig rufen Sie nur Where
in Ihrer Abfrage an. Ich würde dies wie folgt umschreiben:
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%Sie erhalten die Fehlermeldung, da LINQ-Abfragen IEnumerable und nicht List zurückgeben.
Wenn Sie eine Liste benötigen, ist es einfach:
%Vor% 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:
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):
Ein anderer Ansatz, falls eine Spalte fehlt, ist nicht unbedingt ein "Problem":
%Vor%Sie müssen IQueriable & lt; & gt; List & lt; & gt; durch Aufrufen von ToList ();
%Vor%Tags und Links c# visual-studio-2010 linq