Ich würde dies als einen geeigneten Ort betrachten, um die Trennung von Befehlen und Abfragen zu verwenden . Beispielsweise:
// query
var validItems = items.Where(i => i.Field != null && i.State != ItemStates.Deleted);
// command
foreach (var item in validItems) {
// do stuff
}
Auf diese Weise können Sie dem Abfrageergebnis auch einen guten, selbstdokumentierenden Namen geben. Es hilft Ihnen auch dabei, Möglichkeiten für die Umgestaltung zu erkennen, da es viel einfacher ist, Code umzugestalten, der nur Daten abfragt oder nur Daten mutiert, als gemischten Code, der versucht, beides zu tun.
Beim Debuggen können Sie eine Pause einlegen, foreach
um schnell zu überprüfen, ob der Inhalt der validItems
Lösung Ihren Erwartungen entspricht. Sie müssen nicht ins Lambda steigen, es sei denn, Sie müssen. Wenn Sie in das Lambda einsteigen müssen, dann schlage ich vor, es in eine separate Funktion zu zerlegen und diese stattdessen durchzugehen.
Gibt es einen Leistungsunterschied? Wenn die Abfrage von einer Datenbank gesichert wird, kann die LINQ-Version möglicherweise schneller ausgeführt werden, da die SQL-Abfrage möglicherweise effizienter ist. Wenn es sich um LINQ to Objects handelt, werden Sie keinen echten Leistungsunterschied feststellen. Profilieren Sie Ihren Code wie immer und beheben Sie die tatsächlich gemeldeten Engpässe, anstatt im Voraus Optimierungen vorherzusagen.