Typischer Kontext: Ich erstelle eine Erweiterungsmethode für eine Sammlung, die berücksichtigt, dass die Elemente geordnet sind. Die Funktion beginnt am Anfang, am Index 0, und die Reihenfolge hat Bedeutung. Beispiele: Gruppierung nach Reihenfolge oder Indizes eines Elements .
Ich bin jedoch immer ratlos, was ich erweitern soll: IEnumerable<T>
oder T[]
. Meine Begründung war die Klarheit des Zwecks: Ein Array hat einen Begriff der Reihenfolge, während ein IEnumerable von vielen generischen Sammlungen implementiert wird, von denen nicht alle einen Begriff der Reihenfolge haben:
- Wörterbuch - ungeordnet
- HashSet - ungeordnet
- LinkedList - bestellt
- Liste - bestellt
- Warteschlange - bestellt
- SortedDictionary - sortiert (nicht ursprüngliche Reihenfolge)
- SortedList - sortiert (nicht Originalbestellung)
- SortedSet - sortiert (nicht Originalbestellung)
- Stapel - umgekehrt
Sowie jede andere Implementierung, die bestellt werden kann oder nicht.
Ich bin mir auch nicht sicher, ob der Enumerator zurückgesetzt wird, wenn eine Enumeration nicht abgeschlossen ist. Wenn dies also eine Sorge ist, wer weiß dann, an welchem Punkt die Enumeration beginnen würde? Das Aufzählen eines Arrays würde immer am Anfang beginnen.
Für mich ist es also sinnvoller, a zu erweitern T[]
. Aber bin ich richtig, wenn ich das denke? Mache ich mir zu viele Sorgen? Was ist der richtige Ansatz, um eine "geordnete" Aufzählung sicherzustellen?
Dictionary
? Wahrscheinlich nicht. Wie Scott Meyers sagte: "Der beste Weg, um eine falsche Verwendung zu verhindern, besteht darin, eine solche Verwendung unmöglich zu machen." . Ist dies in diesem Szenario möglich / sinnvoll?Ich denke, dass Sie 2 verschiedene Konzepte zu 1 kombinieren möchten. Die Datenstruktur und ihre Inhaltsreihenfolge sind zwei getrennte Dinge.
Bestellen ist ein heikles Thema. Was bedeutet es zum Beispiel, eine Personenliste zu bestellen? Selbst wenn der Bestell- / Sortierschlüssel definiert ist, muss er eine Richtung haben und Sie müssen entscheiden, was mit Nullen (falls vorhanden), Datumsproblemen usw. geschehen soll.
Wenn die Datenreihenfolge für Ihre Methode wichtig ist, sollte Ihre Methode möglicherweise für die Reihenfolge der Daten im Rahmen ihrer Einrichtung verantwortlich sein, anstatt zu verlangen, dass die Daten vom Anrufer bestellt werden. Ein ähnlicher Ansatz wird von einigen String-Match-Algorithmen verwendet, bei denen ein Wörterbuch innerhalb der Suchmethode aus der übergebenen Zeichenfolge erstellt wird, bevor die Zeichenfolge durchsucht wird. Ich weiß, dass dies nicht der genaue Fall ist, aber es ist das nächste Beispiel, an das ich denken könnte.
quelle
IEnumerable erklärt, dass die Sammlung, über die Sie verfügen, aufgelistet werden kann. es impliziert nichts über den Inhalt. Dies ist keine schlechte Sache - Container können zusätzlich zu einzelnen Schnittstellen zusätzliche Funktionen und Einschränkungen aufweisen.
(Ich sehe nicht, wie ein Array hier besser ist - es ist indizierbar, ebenso wie eine IList und andere Container, aber es gibt nichts an der Indizierung, was eine Datenreihenfolge impliziert. Ihre Liste ist seltsam - einige Elemente sind "geordnet" "Da sie die Einfügereihenfolge beibehalten, werden andere" sortiert ", wie sie sortiert sind. Es handelt sich um zwei verschiedene Dinge. Abgesehen vom SortedSet / SortedList / SortedDictionary sollten Sie nicht davon ausgehen, dass sich die Daten in einer bestimmten Reihenfolge befinden, es sei denn, Sie behandeln dies in Ihrem eigenen Code.)
IEnumerable bietet jedoch eine LINQ-Erweiterung, mit der Sie .OrderBy verwenden können, sodass alles, was aufzählbar ist, in einer sortierten Reihenfolge von IOrderedEnumerable zurückgegeben werden kann. Dies ist jedoch eine LINQ-spezifische Schnittstelle (und nicht standardmäßig von SortedSet / SortedList / SortedDictionary implementiert, daher ist es möglicherweise nicht sinnvoll, diese bestimmte Schnittstelle zu erweitern ...)
quelle