Ersetzen, wenn(x) Foreach() mit Foreach.Wo(x)
Wahrscheinlich eine dumme Frage, aber ich habe eine Menge:
if(X)
{
foreach(var Y in myList.Where(z => z == 1)
{
}
}
Konstrukte im code
Ersetzt es mit
foreach(var Y in myList.Where(z => X && z == 1) { }
verrückt?
Ist es wohl weniger lesbar, aber der compiler optimiert, um es so ziemlich der gleiche code?
InformationsquelleAutor der Frage Andrew White | 2010-09-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, deine erste version ist besser und schneller. Die zweite version wird bewerten
X
für jedes element in der Sequenz, wennX
wahr ist.Sollten Sie stick mit der ersten version.
InformationsquelleAutor der Antwort Andrew Hare
Die 2. option wird viel langsamer, wenn x false ist, wie Sie machen linq überprüfen Sie alle Elemente in der Liste wenn Sie wissen, dass die Prüfung immer fehlschlagen.
Den compiler optimizer wird nicht in der Lage, rückgängig machen den Schaden. Diese Stufe der Optimierung ist normalerweise nur möglich in funktionalen Sprachen, wie es ist zu schwer für einen compiler zu verfolgen, mögliche Nebenwirkungen.
Linq nicht-Optimierungen eingebaut, die es überall in der Nähe, was Sie erwarten von einem SQL-query rewriter in einer Datenbank.
InformationsquelleAutor der Antwort Ian Ringrose
Werden Sie nicht kompilieren, um den gleichen code. In der zweiten version
X
ausgewertet, viele Male undmyList
aufgelistet wird. Worst-case-Szenario ist die BewertungX
etwas ändert, und Sie haben unvorhersehbare Funktionalität.InformationsquelleAutor der Antwort Yuriy Faktorovich