Ich habe eine foreach-Schleife, die eine Liste von Objekten eines Typs liest und eine Liste von Objekten eines anderen Typs erzeugt. Mir wurde gesagt, dass ein Lambda-Ausdruck das gleiche Ergebnis erzielen kann.
var origList = List<OrigType>(); // assume populated
var targetList = List<TargetType>();
foreach(OrigType a in origList) {
targetList.Add(new TargetType() {SomeValue = a.SomeValue});
}
Für jede Hilfe wäre ich dankbar - ich bin neu in Lambda und Linq. danke, s
Versuchen Sie Folgendes
var targetList = origList
.Select(x => new TargetType() { SomeValue = x.SomeValue })
.ToList();
Hier wird eine Kombination aus Lambdas und LINQ verwendet, um die Lösung zu erreichen. Die Select-Funktion ist eine Projektionsmethode, die den übergebenen Delegaten (oder in diesem Fall Lambda) auf jeden Wert in der ursprünglichen Sammlung anwendet. Das Ergebnis wird in einem neuen IEnumerable<TargetType>
zurückgegeben. Der .ToList-Aufruf ist eine Erweiterungsmethode, die diese IEnumerable<TargetType>
in eine List<TargetType>
umwandelt.
Wenn Sie wissen, dass Sie von List<T1>
nach List<T2>
konvertieren wollen, dann ist List<T>.ConvertAll
etwas effizienter als Select
/ToList
, weil es die genaue Größe kennt, mit der es beginnen soll:
target = orig.ConvertAll(x => new TargetType { SomeValue = x.SomeValue });
Im allgemeineren Fall, wenn man nur die Quelle als IEnumerable<T>
kennt, ist die Verwendung von Select
/ToList
der richtige Weg. Man könnte auch argumentieren, dass es in einer Welt mit LINQ idiomatischer ist, damit zu beginnen... aber es lohnt sich, zumindest die Option ConvertAll
zu kennen.
Ich glaube, so etwas sollte funktionieren:
origList.Select(a => new TargetType() { SomeValue = a.SomeValue});