Ich verstehe nicht, warum ich ein IEnumerable erstellen würde. Oder warum es wichtig ist.
Ich schaue mir das Beispiel für IEnumerable an: Ссылка
Aber ich kann grundsätzlich dasselbe machen, wenn ich einfach gegangen bin:
Für was ist IEnumerable gut? Können Sie mir eine Situation geben, in der ich eine Klasse erstellen müsste, die IEnumerable implementiert?
IEnumerable
ist eine Schnittstelle, sie setzt bestimmte Dinge nach außen frei. Während Sie völlig richtig sind, können Sie einfach List<T>
verwenden, aber List<T>
ist sehr tief in der Vererbungsstruktur. Was genau macht ein List<T>
? Es speichert Artikel, es bietet bestimmte Methoden zu Add
und Remove
. Nun, was ist, wenn Sie nur die Funktion "Artikelaufbewahrung" eines List<T>
benötigen? Das ist, was ein IEnumerable<T>
ist - eine abstrakte Art zu sagen "Ich möchte eine Liste von Items bekommen, über die ich iterieren kann". Eine Liste ist "Ich möchte eine Sammlung erhalten, die ich ändern kann, kann nach Index zugreifen und iterieren". List<T>
bietet viel mehr Funktionalität als IEnumerable<T>
, benötigt aber mehr Speicher. Wenn also eine Methode ein IEnumerable<T>
verwendet, ist es egal, was genau es bekommt, solange das Objekt die Möglichkeiten von IEnumerable<T>
bietet.
Sie müssen auch nicht Ihr eigenes IEnumerable<T>
, ein List<T>
IS und ein IEnumerable<T>
!
Listen sind natürlich IEnumerable
- Als allgemeine Regel, möchten Sie spezifisch sein, was Sie ausgegeben haben, aber breit in dem, was Sie als Eingabe akzeptieren, zB:
Sie haben ein Sub, das eine Liste von Objekten durchläuft und etwas in die Konsole schreibt ...
Sie könnten den Parameter entweder als IEnumerable<T>
oder IList<T>
(oder sogar als List<T>
) deklarieren. Da Sie der Eingabeliste nicht hinzufügen müssen, müssen Sie nur aufzählen - also IEnumerable
-, dann akzeptiert Ihre Methode auch andere Typen, die IEnumerable implementieren, einschließlich IQueryable
, Verkettete Listen usw. .
Sie machen Ihre Methoden generischer ohne Kosten.
Heutzutage würden Sie IEnumerable in der Regel nicht mehr verwenden, es sei denn, Sie unterstützten Software auf einer älteren Version des Frameworks. Heute würden Sie normalerweise IEnumerable<T>
verwenden. Neben anderen Vorteilen implementiert IEnumerable alle LINQ-Operationen / -Erweiterungen vollständig, sodass Sie problemlos jeden List-Typ abfragen können, der IEnumerable<T>
mithilfe von LINQ implementiert.
Außerdem bindet es den Consumer Ihres Codes nicht an eine bestimmte Auflistungsimplementierung.
Es ist selten, dass Sie heutzutage eigene Container-Klassen erstellen müssen, da Sie genau dort sind, gibt es viele gute Implementierungen.
Wenn Sie jedoch aus einem bestimmten Grund Ihre eigene Container-Klasse erstellen, möchten Sie IEnumerable oder IEnumerable<T>
implementieren, da es sich um einen standardmäßigen "Vertrag" für die Iteration handelt, und indem Sie eine Implementierung bereitstellen, können Sie Methoden / apis nutzen das will ein IEnumerable oder IEnumerable<T>
Linq zum Beispiel gibt Ihnen eine Reihe von nützlichen Erweiterungsmethoden kostenlos.
Ein IList
kann als eine spezielle Implementierung von IEnumerable
angesehen werden. (Eine, die leicht hinzugefügt und entfernt werden kann.) Es gibt andere, wie zum Beispiel IDictionary
, die eine völlig andere Funktion ausführen, aber immer noch aufgelistet werden können. Im Allgemeinen würde ich IEnumerable
als eine allgemeinere Typreferenz verwenden, wenn ich nur eine Aufzählung benötige, um eine Anforderung zu erfüllen, und sich nicht besonders darum kümmere, welche Art es ist. Ich kann es ein IList
übergeben und öfter als das nicht, mache ich nur das, aber die Flexibilität besteht auch, andere Aufzählungen zu übergeben.
Hier ist eine Situation, in der ich denke, dass ich IEnumerable implementieren muss, aber nicht List & lt; & gt;
Ich möchte alle Elemente von einem Remote-Server erhalten. Sagen wir, ich habe eine Million Artikel, die zurückkehren werden. Wenn Sie List & lt; & gt; Ansatz müssen Sie zuerst alle eine Million Elemente im Speicher zwischenspeichern. In einigen Fällen möchten Sie das nicht wirklich tun, weil Sie nicht zu viel Speicher verbrauchen möchten. Mit IEnumerable können Sie die Daten auf dem Bildschirm anzeigen und dann sofort verwerfen. Daher ist der Speicherbedarf des Programms durch den IEnumerable-Ansatz wesentlich geringer.
Ich verstehe, dass IEnumerable Ihnen als Schnittstelle zum Erstellen eigener aufzählbarer Klassentypen zur Verfügung gestellt wird.
Ich glaube, ein einfaches Beispiel hierfür wäre die Neuerstellung des List
-Typs, wenn Sie dafür eigene Features (oder deren Fehlen) haben möchten.
Was ist, wenn Sie eine Auflistung einer potenziell unendlichen Größe aufzählen möchten, wie z. B. die Fibonacci-Zahlen? Sie könnten das nicht so einfach mit einer Liste machen, aber wenn Sie eine Klasse haben, die IEnumerable
oder IEnumerable<T>
implementiert, wird es einfach.
Wenn ein eingebauter Container Ihren Anforderungen entspricht, sollten Sie ihn auf jeden Fall verwenden, und IEnumerable wird kostenlos geliefert. Wenn Sie aus irgendeinem Grund einen eigenen Container implementieren müssen, beispielsweise wenn er von einer DB unterstützt werden muss, sollten Sie sicherstellen, dass sowohl IEnumerable
als auch IEnumerable<T>
aus zwei Gründen implementiert werden:
IEnumerable bietet Ihren API-Benutzern (einschließlich Ihnen selbst) die Möglichkeit, Ihre Sammlung mithilfe einer foreach zu verwenden. Zum Beispiel habe ich IENumerable in meiner Binary Tree-Klasse implementiert, so dass ich einfach über alle Elemente in der Baumstruktur forschen konnte, ohne Ctrl + C Ctrl + V die gesamte erforderliche Logik zum Durchlaufen des Baums InOrder verwenden zu müssen.
Ich hoffe, es hilft:)
IEnumerable ist nützlich, wenn Sie eine Sammlung oder Methode haben, die eine Menge Dinge zurückgeben kann, aber kein Dictionary, List, Array oder eine andere vordefinierte Sammlung ist. Dies ist besonders nützlich in Fällen, in denen die Menge der zurückzugebenden Dinge möglicherweise nicht verfügbar ist, wenn man sie ausgibt. Beispielsweise kann ein Objekt, das auf Datensätze in einer Datenbank zugreifen soll, iEnumerable implementieren. Während es für ein solches Objekt möglich sein könnte, alle geeigneten Datensätze in ein Array zu lesen und dieses zurückzugeben, kann dies bei vielen Datensätzen nicht praktikabel sein. Stattdessen könnte das Objekt einen Enumerator zurückgeben, der die Datensätze in kleinen Gruppen lesen und einzeln zurückgeben könnte.
Tags und Links c#