Ich schreibe oft Code wie folgt: if (list.Count > 0) { }
Ist das effizient?
Ja. Das ruft die Zählung in der Liste ab, die in einem Feld innerhalb der Liste gespeichert ist, und vergleicht es mit Null.
Jetzt eine Frage, die Sie nicht fragen:
Was if (sequence.Count() > 0) { }
? (Beachten Sie die Klammern auf Count()
.)
Wir befragen die Sequenz zur Laufzeit zu sehen, ob es sich um eine Liste, die eine Count
Eigenschaft hat, die effizient berechnet werden kann. Wenn es so ist, nennen wir es. Wenn nicht, zählen wir die gesamte Sequenz jeweils ein Element und vergleichen das dann mit Null.
Ist das nicht unglaublich ineffizient?
Ja.
Was wäre effizienter?
if (sequence.Any())
Warum ist die effiziente?
Weil es versucht, über eins Element zu iterieren. Wenn es gelingt, dann ist Any
wahr; Wenn es fehlschlägt, ist Any
falsch. Sie müssen nicht die Anzahl der Jelly Beans im Glas zählen, um zu wissen, ob es mehr als Null gibt. Sie müssen nur nachsehen, ob es mindestens eine gibt.
Zusätzlich zu wesentlich effizienterem Code liest sich der Code nun wie die beabsichtigte Bedeutung des Codes. Wenn Sie fragen möchten: "Gibt es Gegenstände in der Liste?" dann frage "Gibt es irgendwelche Gegenstände in der Liste?" und nicht "ist die Anzahl der Elemente in der Liste größer als Null?"
Was ist mit der Capacity
Eigenschaft einer Liste?
Das sagt Ihnen, wie viel Speicherplatz in den internen Datenstrukturen der Liste vorab reserviert wurde. Dies ist die Anzahl der Elemente, die die Liste speichern kann, bevor sie mehr Speicher zuweisen muss.
"Wir fragen die Sequenz zur Laufzeit ab, um zu sehen, ob es eine Liste mit einer Count-Eigenschaft gibt, die effizient berechnet werden kann." Was meinst du damit? Suchen Sie nach einer Eigenschaft namens "Count" oder überprüfen Sie, ob ICollection implementiert ist? Der zweite hat lustige Sonderfälle, wenn Sie die Kovarianz 'IEnumerable 'verwenden. –
CodesInChaos
@CodeInChaos: Wenn man über Reflection nach einer Eigenschaft namens Count sucht, wäre das sowohl langsam als auch unzuverlässig. Wir suchen nach einer Implementierung der Schnittstelle. Und ja, Sie können als Ergebnis von Kovarianzproblemen falsche Negative erhalten. Wenn es schmerzt, wenn du das tust, dann tu das nicht. –
@CodeInChaos Wenn die Überprüfung für 'ICollection' fehlschlägt, sucht der Code nach nicht generischer 'ICollection'. Daher sind die meisten Framework-Sammlungen vor dem Kovarianzproblem geschützt. –
phoog