Ich habe einige Zweifel an der Funktionsweise von Enumeratoren und LINQ. Betrachten Sie diese beiden einfachen Auswahlmöglichkeiten:
List<Animal> sel = (from animal in Animals
join race in Species
on animal.SpeciesKey equals race.SpeciesKey
select animal).Distinct().ToList();
oder
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 Folgendes:
foreach (Animal animal in sel) { /*do stuff*/ }
Mir ist aufgefallen, dass
IEnumerable
beim Debuggen und Überprüfen von "sel", in diesem Fall IEnumerable, einige interessante Elemente angezeigt werden: "inner", "Outer", "innerKeySelector" und "OuterKeySelector". Diese beiden letzten Elemente werden angezeigt Delegierte sein. Das "innere" Mitglied enthält keine "Tier" -Instanzen, sondern "Spezies" -Instanzen, was für mich sehr seltsam war. Das "äußere" Mitglied enthält "Tier" -Instanzen. Ich gehe davon aus, dass die beiden Delegierten bestimmen, was rein und was raus geht.Ich habe festgestellt, dass bei Verwendung von "Distinct" das "Inner" 6 Elemente enthält (dies ist falsch, da nur 2 Distinct sind), das "Outer" jedoch die richtigen Werte enthält. Auch hier bestimmen wahrscheinlich die delegierten Methoden dies, aber dies ist etwas mehr als ich über IEnumerable weiß.
Welche der beiden Optionen ist vor allem in Bezug auf die Leistung die beste?
Die böse Listenkonvertierung über .ToList()
?
Oder vielleicht den Enumerator direkt benutzen?
Wenn Sie können, erklären Sie bitte auch ein wenig oder werfen Sie einige Links, die diese Verwendung von IEnumerable erklären.