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*/ }
-
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? -
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.
-
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.