Tengo algunas dudas sobre cómo funcionan los enumeradores y LINQ. Considere estas dos selecciones simples:
List<Animal> sel = (from animal in Animals
join race in Species
on animal.SpeciesKey equals race.SpeciesKey
select animal).Distinct().ToList();
o
IEnumerable<Animal> sel = (from animal in Animals
join race in Species
on animal.SpeciesKey equals race.SpeciesKey
select animal).Distinct();
Cambié los nombres de mis objetos originales para que parezca un ejemplo más genérico. La consulta en sí no es tan importante. Lo que quiero preguntar es esto:
foreach (Animal animal in sel) { /*do stuff*/ }
Me di cuenta de que si utilizo
IEnumerable
, cuando depuro e inspecciono "sel", que en ese caso es el IEnumerable, tiene algunos miembros interesantes: "inner", "external", "innerKeySelector" y "externalKeySelector", estos últimos 2 aparecen ser delegados El miembro "interno" no tiene instancias de "Animal", sino instancias de "Especies", lo cual fue muy extraño para mí. El miembro "externo" contiene instancias "animales". Supongo que los dos delegados determinan qué entra y qué sale.Me di cuenta de que si uso "Distinct", el "interno" contiene 6 elementos (esto es incorrecto ya que solo 2 son distintos), pero el "externo" contiene los valores correctos. De nuevo, probablemente los métodos delegados determinan esto, pero esto es un poco más de lo que sé sobre IEnumerable.
Lo más importante, ¿cuál de las dos opciones es la mejor en cuanto a rendimiento?
La conversión Lista mal a través de .ToList()
?
¿O tal vez usando el enumerador directamente?
Si puede, explique también un poco o arroje algunos enlaces que expliquen este uso de IEnumerable.