Tenho algumas dúvidas sobre como funcionam os enumeradores e o LINQ. Considere estas duas seleções simples:
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();
Alterei os nomes dos meus objetos originais para que isso pareça um exemplo mais genérico. A consulta em si não é tão importante. O que eu quero perguntar é o seguinte:
foreach (Animal animal in sel) { /*do stuff*/ }
Percebi que se eu usar
IEnumerable
, quando depurar e inspecionar "sel", que nesse caso é o IEnumerable, ele possui alguns membros interessantes: "inner", "outer", "innerKeySelector" e "outerKeySelector", esses dois últimos aparecem para ser delegados. O membro "interno" não possui instâncias "Animal", mas instâncias "Espécies", o que foi muito estranho para mim. O membro "externo" contém instâncias "Animal". Presumo que os dois delegados determinem qual entra e o que sai dela?Percebi que, se eu usar "Distinto", o "interno" conterá 6 itens (isso está incorreto, pois apenas 2 são Distintos), mas o "externo" conterá os valores corretos. Novamente, provavelmente os métodos delegados determinam isso, mas isso é um pouco mais do que eu sei sobre IEnumerable.
Mais importante, qual das duas opções é a melhor em termos de desempenho?
A conversão da lista do mal via .ToList()
?
Ou talvez usando o enumerador diretamente?
Se puder, explique um pouco ou ative alguns links que explicam esse uso do IEnumerable.