I have some doubts over how
Enumerators work, and LINQ. Consider these two simple
selects:
List sel =
(from animal in Animals
join race in Species
on animal.SpeciesKey
equals race.SpeciesKey
select
animal).Distinct().ToList();
or
IEnumerable
sel = (from animal in Animals
join race in Species
on
animal.SpeciesKey equals race.SpeciesKey
select
animal).Distinct();
I
changed the names of my original objects so that this looks like a more generic example.
The query itself is not that important. What I want to ask is
this:
foreach (Animal animal in
sel) { /*do stuff*/
}
I
noticed that if I useIEnumerable
, when I debug and inspect
"sel", which in that case is the IEnumerable, it has some interesting members: "inner",
"outer", "innerKeySelector" and "outerKeySelector", these last 2 appear to be delegates.
The "inner" member does not have "Animal" instances in it, but rather "Species"
instances, which was very strange for me. The "outer" member does contain "Animal"
instances. I presume that the two delegates determine which goes in and what goes out of
it?I noticed that if I use
"Distinct", the "inner" contains 6 items (this is incorrect as only 2 are Distinct), but
the "outer" does contain the correct values. Again, probably the delegated methods
determine this but this is a bit more than I know about
IEnumerable.Most importantly, which
of the two options is the best
performance-wise?
The
evil List conversion via
.ToList()
?
Or maybe
using the enumerator directly?
If you can,
please also explain a bit or throw some links that explain this use of
IEnumerable.
No comments:
Post a Comment