Gibt es eine bessere Möglichkeit, Folgendes zu tun:
Ich muss prüfen, ob in der Datei null vorkommt. Kopfzeilen, bevor ich mit der Schleife fortfahre
if (file.Headers != null)
{
foreach (var h in file.Headers)
{
//set lots of properties & some other stuff
}
}
Kurz gesagt, es sieht ein bisschen hässlich aus, das foreach in das if zu schreiben, da in meinem Code ein Einrückungsgrad auftritt.
Ist etwas, das zu bewerten wäre
foreach(var h in (file.Headers != null))
{
//do stuff
}
möglich?
Antworten:
Nur als kleine kosmetische Ergänzung zu Runes Vorschlag können Sie Ihre eigene Erweiterungsmethode erstellen:
Dann können Sie schreiben:
Ändern Sie den Namen nach Geschmack :)
quelle
Angenommen, der Elementtyp in file.Headers ist T, könnten Sie dies tun
Dadurch wird eine leere Aufzählung von T erstellt, wenn file.Headers null ist. Wenn der Dateityp ein Typ ist, den Sie besitzen, würde ich jedoch in Betracht ziehen,
Headers
stattdessen den Getter von zu ändern .null
ist der Wert von unknown. Wenn möglich, anstatt null als "Ich weiß, dass es keine Elemente gibt" zu verwenden, wenn null tatsächlich (/ ursprünglich) als "Ich weiß nicht, ob es Elemente gibt" interpretiert werden sollte, verwenden Sie eine leere Menge, um anzuzeigen dass Sie wissen, dass das Set keine Elemente enthält. Das wäre auch DRY'er, da Sie die Nullprüfung nicht so oft durchführen müssen.BEARBEITEN Als Folge von Jons Vorschlag können Sie auch eine Erweiterungsmethode erstellen, die den obigen Code in ändert
In dem Fall, in dem Sie den Getter nicht ändern können, wäre dies meine eigene Präferenz, da es die Absicht klarer ausdrückt, indem Sie der Operation einen Namen geben (OrEmptyIfNull).
Die oben erwähnte Erweiterungsmethode kann es dem Optimierer unmöglich machen, bestimmte Optimierungen zu erkennen. Insbesondere diejenigen, die mit IList in Verbindung stehen, indem diese Methode überladen wird, können eliminiert werden
quelle
null
) Entartung der gesamten Schleife zum LCD vonIEnumerable<T>
(wie bei Verwendung von ??) beinhaltet. würde), b) das Hinzufügen einer Erweiterungsmethode zu jedem Projekt erfordern, oder c) das Vermeiden vonnull
IEnumerables
(Pffft! Puh-LEAZE! SMH. ) erfordern (cuznull
bedeutet N / A, während leere Liste bedeutet, dass es anwendbar ist, aber derzeit ist, gut, leer!, dh ein Mitarbeiter könnte Provisionen haben, die N / A für Nicht-Verkäufe oder leer für Verkäufe sind, wenn er keine verdient hat).IEnumerable
der restriktiver als dieforeach
Anforderungen, aber weniger restriktiv als die AnforderungenList<T>
in der Antwort ist, auf die Sie verlinken. Welche haben die gleiche Leistungseinbuße beim Testen, ob die Aufzählung null ist.List<T>
.Ehrlich gesagt rate ich: saugen Sie einfach den
null
Test auf. Einnull
Test ist nur einbrfalse
oderbrfalse.s
; alles andere wird sich viel mehr Arbeit (Tests, Aufgaben, zusätzliche Methodenaufrufe, unnötige beinhaltenGetEnumerator()
,MoveNext()
,Dispose()
auf dem Iterator, etc).Ein
if
Test ist einfach, offensichtlich und effizient.quelle
Das "Wenn" vor der Iteration ist in Ordnung, nur wenige dieser "hübschen" Semantiken können Ihren Code weniger lesbar machen.
Wenn die Einrückung Sie stört, können Sie das zu ändernde if ändern:
und Sie gelangen nur dann zur foreach-Schleife, wenn die Eigenschaft headers einen wahren Wert enthält.
Eine andere Option, über die ich nachdenken kann, ist die Verwendung des Null-Koaleszenz-Operators in Ihrer foreach-Schleife und die vollständige Vermeidung der Nullprüfung. Stichprobe:
(Ersetzen Sie die Sammlung durch Ihr wahres Objekt / Ihren wahren Typ)
quelle
Verwenden des nullbedingten Operators und von ForEach (), die schneller als die Standard-foreach-Schleife arbeiten.
Sie müssen die Sammlung jedoch in List umwandeln.
quelle
Ich verwende eine nette kleine Erweiterungsmethode für diese Szenarien:
Da es sich bei den Headern um eine Typliste handelt, können Sie Folgendes tun:
quelle
??
Operator verwenden und die return-Anweisung aufreturn list ?? new List<T>;
null
in Ihrer Probefile.Headers.EnsureNotNull() != null
nicht benötigt und ist sogar falsch?In einigen Fällen würde ich eine etwas andere generische Variante bevorzugen, vorausgesetzt, dass Standardauflistungskonstruktoren in der Regel leere Instanzen zurückgeben.
Es wäre besser, diese Methode zu benennen
NewIfDefault
. Dies kann nicht nur für Sammlungen nützlich sein, daherIEnumerable<T>
ist die Typbeschränkung möglicherweise redundant.quelle