858 Stimmen

IEnumerable vs. Liste - Was ist zu verwenden? Wie funktionieren sie?

Ich habe einige Zweifel darüber, wie Enumerators arbeiten, und LINQ. Betrachten Sie diese beiden einfachen Selects:

List<Animal> sel = (from animal in Animals 
                    join race in Species
                    on animal.SpeciesKey equals race.SpeciesKey
                    select animal).Distinct().ToList();

ou

IEnumerable<Animal> sel = (from animal in Animals 
                           join race in Species
                           on animal.SpeciesKey equals race.SpeciesKey
                           select animal).Distinct();

Ich habe die Namen meiner ursprünglichen Objekte geändert, damit dies wie ein allgemeineres Beispiel aussieht. Die Abfrage selbst ist nicht so wichtig. Was ich fragen möchte, ist dies:

foreach (Animal animal in sel) { /*do stuff*/ }
  1. Ich habe festgestellt, dass ich bei der Verwendung von IEnumerable Wenn ich debugge und "sel" inspiziere, was in diesem Fall die IEnumerable ist, hat sie einige interessante Mitglieder: "inner", "outer", "innerKeySelector" und "outerKeySelector", die letzten beiden scheinen Delegierte zu sein. Das "inner"-Mitglied enthält keine "Animal"-Instanzen, sondern eher "Species"-Instanzen, was für mich sehr seltsam war. Das "äußere" Element enthält "Animal"-Instanzen. Ich nehme an, dass die beiden Delegierten bestimmen, was hineinkommt und was herauskommt?

  2. Ich habe festgestellt, dass, wenn ich "Distinct" verwende, die "innere" 6 Elemente enthält (dies ist falsch, da nur 2 Distinct sind), aber die "äußere" enthält die richtigen Werte. Wieder, wahrscheinlich die delegierten Methoden bestimmen dies, aber dies ist ein bisschen mehr als ich über IEnumerable wissen.

  3. Und vor allem: Welche der beiden Optionen ist leistungsmäßig die beste?

Die böse Liste Konvertierung über .ToList() ?

Oder vielleicht direkt den Enumerator verwenden?

Wenn Sie können, erklären Sie bitte auch ein bisschen oder werfen einige Links, die diese Verwendung von IEnumerable erklären.

4voto

LongChalk Punkte 650

Es gibt viele Fälle (z. B. eine unendliche Liste oder eine sehr große Liste), in denen IEnumerable nicht in eine Liste umgewandelt werden kann. Die offensichtlichsten Beispiele sind alle Primzahlen, alle Nutzer von Facebook mit ihren Daten oder alle Artikel bei eBay.

Der Unterschied besteht darin, dass "List"-Objekte "genau hier und jetzt" gespeichert werden, während "IEnumerable"-Objekte "nur einzeln" funktionieren. Wenn ich also alle Artikel bei ebay durchgehen will, kann das selbst ein kleiner Computer schaffen, aber ".ToList()" würde mir mit Sicherheit den Speicher rauben, egal wie groß mein Computer ist. Kein Computer kann von sich aus eine so große Menge an Daten speichern und verarbeiten.

[Bearbeiten] - Unnötig zu sagen - es ist nicht "entweder dies oder das". oft wäre es sinnvoll, sowohl eine Liste und eine IEnumerable in der gleichen Klasse zu verwenden. Kein Computer der Welt könnte alle Primzahlen auflisten, denn das würde per Definition unendlich viel Speicherplatz benötigen. Aber man könnte sich leicht eine class PrimeContainer die eine IEnumerable<long> primes die aus offensichtlichen Gründen auch eine SortedList<long> _primes . alle bisher berechneten Primzahlen. Die nächste zu prüfende Primzahl würde nur gegen die vorhandenen Primzahlen (bis zur Quadratwurzel) geprüft werden. Auf diese Weise erhalten Sie beides - Primzahlen eine nach der anderen (IEnumerable) und eine gute Liste der "bisherigen Primzahlen", die eine ziemlich gute Annäherung an die gesamte (unendliche) Liste ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X