Was ist der Unterschied zwischen IEnumerable und Arrays?

8

Kann jemand IEnumerable beschreiben und was ist der Unterschied zwischen IEnumerable und Array? und wo man es benutzt .. alle Informationen darüber und wie man es benutzt.

    
Nishant Kumar 26.08.2010, 16:38
quelle

5 Antworten

11

Ein Array ist eine Sammlung von Objekten mit einer festgelegten Größe.

%Vor%

Dies macht es sehr nützlich in Situationen, in denen Sie möglicherweise auf ein Objekt an einer bestimmten Stelle in der Sammlung zugreifen möchten, da der Speicherort jedes Elements bereits bekannt ist

%Vor%

Auch die Größe des Arrays kann schnell berechnet werden.

IEnumerable andererseits sagt im Grunde, dass es bei einer Startposition möglich ist, den nächsten Wert zu erhalten. Ein Beispiel dafür könnte eine unendliche Reihe von Zahlen sein:

%Vor%

Im Gegensatz zu einem Array kann eine aufzählbare Auflistung beliebiger Größe sein und es ist möglich, die Elemente so zu erstellen, wie sie benötigt werden. Dies ermöglicht leistungsstarke Konstrukte und wird von LINQ ausgiebig verwendet, um komplexe Abfragen zu vereinfachen.

%Vor%

Die einzige Möglichkeit, ein bestimmtes Element zu erhalten, besteht jedoch darin, am Anfang zu beginnen und bis zu dem gewünschten Element aufzuzählen. Dies ist wesentlich teurer als das Holen des Elements aus einem vorgenerierten Array.

Natürlich können Sie über ein Array aufzählen, also implementiert ein Array die IEnumerable-Schnittstelle.

    
Martin Harris 26.08.2010, 16:47
quelle
3

.NET hat seine IEnumerable-Schnittstelle falsch benannt - es sollte Iterable sein. Grundsätzlich können Sie mit System.Collection.IEnumerable oder (seit Generics) System.Collection.Generic.IEnumerable foreach für das Objekt verwenden, das diese Schnittstellen implementiert.

(Randnotiz: Eigentlich verwendet .NET die Enttippung für foreach, so dass Sie diese Schnittstellen nicht implementieren müssen - es reicht, wenn Sie die geeigneten Methodenimplementierungen bereitstellen.)

Ein Array (System.Array) ist ein Typ einer Sequenz (wobei mit Sequenz eine iterable Datenstruktur gemeint ist, d.h. alles, was IEnumerable implementiert), mit einigen wichtigen Unterschieden.

Zum Beispiel kann ein IEnumerable - und ist oft - lazy-loaded sein. Das bedeutet, dass die Elemente erst erstellt werden, wenn Sie explizit darüber iterieren. Dies kann zu merkwürdigem Verhalten führen, wenn Sie sich dessen nicht bewusst sind. Als Konsequenz kann ein IEnumerable Ihnen nicht sagen, wie viele Elemente es enthält, bis Sie tatsächlich darüber iterieren (was die Count-Erweiterungsmethode in der System.Linq.Enumerable-Klasse tut).

Ein Array hat eine Length-Eigenschaft, und damit sind wir zum wichtigsten Unterschied gelangt: Ein Array, wenn eine Folge von festen (und bekannten) Items ist. Es bietet auch einen Indexer, so dass Sie bequem auf seine Elemente zugreifen können, ohne sie tatsächlich zu durchlaufen.

Und nur zur Erinnerung: Die "echten" Enumerationen in .NET sind Typen, die mit dem Schlüsselwort enum definiert sind. Sie ermöglichen es Ihnen, eine Auswahl auszudrücken, ohne magische Zahlen oder Zeichenfolgen zu verwenden. Sie können auch als Flags verwendet werden, wenn sie mit FlagsAttribute markiert sind.

Ich empfehle Ihnen, Ihre bevorzugte Suchmaschine zu verwenden, um mehr Details zu diesen Konzepten zu erhalten - meine kurze Zusammenfassung zielt eindeutig nicht darauf ab, einen tiefen Einblick in diese Funktionen zu geben.

    
ShdNx 26.08.2010 16:58
quelle
2

Ein Array ist eine Sammlung von Daten. Es bedeutet, dass die Artikel zusammenhängend sind und direkt adessierbar sind.

IEnumerable ist eine Beschreibung einer Datensammlung. Sie sind nicht selbst Sammlungen. Konkret bedeutet dies, dass die Sammlung einzeln nacheinander durchlaufen werden kann.

Wenn Sie ein Varable als Typ IEnumerable definieren, kann es auf eine Auflistung eines beliebigen Typs verweisen, der zu dieser Beschreibung passt.

Arrays sind aufzählbar. Dies gilt auch für Listen, Wörterbücher, Sets und andere Sammlungstypen. Außerdem können Dinge, die nicht als Sammlung angezeigt werden, Enumerable sein, z. B. eine Zeichenfolge ( IEnumerable<char> ) oder das von Enumerable.Range() zurückgegebene Objekt, das für jeden Schritt ein neues Element generiert, ohne es jemals tatsächlich zu halten überall.

    
James Curran 26.08.2010 16:48
quelle
2

Arrays

Ein .Net-Array ist eine Sammlung mehrerer Werte, die nacheinander im Speicher gespeichert werden. Auf einzelne Elemente in einem Array kann per Index zufällig zugegriffen werden (und das ist ziemlich effizient). Wichtige Mitglieder eines Arrays sind:

  • this[Int32 index] (Indexierungsoperator)
  • Length

C # hat eine integrierte Unterstützung für Arrays und sie können direkt aus dem Code initialisiert werden:

%Vor%

Arrays können auch mehrdimensional sein und mehrere Schnittstellen implementieren, einschließlich IEnumerable<T> (wobei T der Elementtyp des Arrays ist).

IEnumerable & lt; T & gt;

Die Schnittstelle IEnumerable<T> definiert die Methode GetEnumerator() , diese Methode wird jedoch selten direkt verwendet. Stattdessen wird die Schleife foreach verwendet, um die Aufzählung zu durchlaufen:

%Vor%

Wenn die Aufzählung über ein Array oder eine Liste durchgeführt wird, sind alle Elemente in der Aufzählung während der Aufzählung vorhanden. Es ist jedoch auch möglich, Elemente aufzulisten, die während der Aufzählung erstellt werden. Das yield return -Konstrukt ist dafür sehr nützlich.

Es ist möglich, ein Array aus einer Enumeration zu erstellen:

%Vor%

Dadurch werden alle Elemente der Aufzählung abgerufen und nacheinander in einem einzigen Array gespeichert.

Um es zusammenzufassen:

  • Arrays sind eine Sammlung von Elementen, auf die per Index
  • nach dem Zufallsprinzip zugegriffen werden kann
  • Aufzählungen sind Abstraktionen über eine Sammlung von Elementen, auf die nacheinander in Vorwärtsrichtung zugegriffen werden kann
Martin Liversage 26.08.2010 17:08
quelle
1

Eine Sache ist, dass Arrays wahlfreien Zugriff auf bestimmte Inhalte mit fester Größe erlauben. Die IEnumerable-Schnittstelle stellt die Daten sequenziell bereit, die Sie nacheinander aus IEnumerable abrufen können, bis die Datenquelle erschöpft ist.

    
Chris Taylor 26.08.2010 16:51
quelle

Tags und Links