Versuchen wir, mit Hilfe der Logik über den Tellerrand zu schauen und die drei Schnittstellen in Ihrer Frage klar zu verstehen:
Wenn die Klasse einer Instanz die Schnittstelle System.Collection.IEnumerable implementiert, können wir in einfachen Worten sagen, dass diese Instanz sowohl enumerable als auch iterable ist, was bedeutet, dass diese Instanz es irgendwie erlaubt, in einer einzigen Schleife alle Elemente und Elemente, die diese Instanz enthält, zu gehen/zu holen/zu passieren/zu durchqueren/zu durchlaufen.
Dies bedeutet, dass es auch möglich ist, alle Elemente dieser Instanz aufzuzählen.
Jede Klasse, die die Schnittstelle System.Collection.IEnumerable implementiert, implementiert auch die Methode GetEnumerator, die keine Argumente benötigt und eine System.Collections.IEnumerator-Instanz zurückgibt.
Instanzen der System.Collections.IEnumerator-Schnittstelle verhalten sich sehr ähnlich wie C++-Iteratoren.
Wenn die Klasse einer Instanz die Schnittstelle System.Collection.ICollection implementiert, können wir in einfachen Worten sagen, dass diese Instanz eine Sammlung von Dingen ist.
Die generische Version dieser Schnittstelle, d. h. System.Collection.Generic.ICollection, ist informativer, da diese generische Schnittstelle explizit angibt, von welchem Typ die Dinge in der Sammlung sind.
Das ist alles vernünftig, rational, logisch und macht Sinn, dass die Schnittstelle System.Collections.ICollection von der Schnittstelle System.Collections.IEnumerable erbt, denn theoretisch ist jede Sammlung sowohl aufzählbar als auch wiederholbar und es ist theoretisch möglich, alle Elemente in jeder Sammlung zu durchlaufen.
Die Schnittstelle System.Collections.ICollection stellt eine endliche dynamische Sammlung dar, die veränderbar ist, d.h. vorhandene Elemente können aus der Sammlung entfernt und neue Elemente können derselben Sammlung hinzugefügt werden.
Dies erklärt, warum die Schnittstelle System.Collections.ICollection über die Methoden "Add" und "Remove" verfügt.
Da es sich bei den Instanzen der Schnittstelle System.Collections.ICollection um endliche Sammlungen handelt, impliziert das Wort "endlich", dass jede Sammlung dieser Schnittstelle immer eine endliche Anzahl von Elementen enthält.
Die Eigenschaft Count der Schnittstelle System.Collections.ICollection soll diese Zahl zurückgeben.
Die Schnittstelle System.Collections.IEnumerable verfügt nicht über diese Methoden und Eigenschaften, die die Schnittstelle System.Collections.ICollection hat, weil es keinen Sinn macht, dass System.Collections.IEnumerable diese Methoden und Eigenschaften hat, die die Schnittstelle System.Collections.ICollection hat.
Die Logik besagt auch, dass jede Instanz, die sowohl aufzählbar als auch iterierbar ist, nicht unbedingt eine Sammlung und nicht notwendigerweise veränderbar ist.
Wenn ich änderbar sage, meine ich damit, dass Sie nicht sofort denken, dass Sie etwas zu etwas hinzufügen oder entfernen können, das sowohl aufzählbar als auch iterierbar ist.
Wenn ich gerade eine endliche Folge von Primzahlen erstellt habe, ist diese endliche Folge von Primzahlen in der Tat eine Instanz der Schnittstelle System.Collections.IEnumerable, denn jetzt kann ich alle Primzahlen in dieser endlichen Folge in einer einzigen Schleife durchgehen und mit jeder von ihnen tun, was ich will, z. B. jede von ihnen auf der Konsole oder dem Bildschirm ausgeben, aber diese endliche Folge von Primzahlen ist keine Instanz der Schnittstelle System.Collections.ICollection, weil es keinen Sinn macht, dieser endlichen Folge von Primzahlen zusammengesetzte Zahlen hinzuzufügen.
Außerdem möchte man in der nächsten Iteration die nächstgrößere Primzahl zur aktuellen Primzahl in der aktuellen Iteration erhalten, wenn das der Fall ist, möchte man auch keine bestehenden Primzahlen aus dieser endlichen Folge von Primzahlen entfernen.
Wahrscheinlich möchten Sie auch "yield return" in der GetEnumerator-Methode der System.Collections.IEnumerable-Schnittstelle verwenden, codieren und schreiben, um die Primzahlen zu erzeugen und nichts auf dem Heap-Speicher zuzuweisen und dann den Garbage Collector (GC) damit zu beauftragen, diesen Speicher sowohl freizugeben als auch zu deallokieren, denn dies ist offensichtlich sowohl eine Verschwendung von Betriebssystemspeicher als auch eine Leistungsminderung.
Die dynamische Speicherzuweisung und -freigabe auf dem Heap sollte erfolgen, wenn die Methoden und Eigenschaften der Schnittstelle System.Collections.ICollection aufgerufen werden, aber nicht, wenn die Methoden und Eigenschaften der Schnittstelle System.Collections.IEnumerable aufgerufen werden (obwohl die Schnittstelle System.Collections.IEnumerable nur eine Methode und 0 Eigenschaften hat).
Nach dem, was andere auf dieser Stack Overflow-Webseite sagten, stellt die Schnittstelle System.Collections.IList einfach eine bestellbar Dies erklärt, warum die Methoden der Schnittstelle System.Collections.IList im Gegensatz zu denen der Schnittstelle System.Collections.ICollection mit Indizes arbeiten.
Kurz gesagt, die Schnittstelle System.Collections.ICollection impliziert nicht, dass eine Instanz davon ordnbar ist, aber die Schnittstelle System.Collections.IList impliziert dies.
Theoretisch ist die geordnete Menge ein Spezialfall der ungeordneten Menge.
Das macht auch Sinn und erklärt, warum die Schnittstelle System.Collections.IList die Schnittstelle System.Collections.ICollection erbt.
0 Stimmen
Also die Antwort ist, es ist nicht zwingend ICollection zu verwenden. und ich kann IEnumerable verwenden, wenn Iteration ist alles, was ich will. richtig?