Ho dei dubbi su come funzionano gli enumeratori e su LINQ. Considera queste due semplici selezioni:
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();
Ho cambiato i nomi dei miei oggetti originali in modo che questo assomigli ad un esempio più generico. La query in sé non è così importante. Quello che voglio chiedere è questo:
foreach (Animal animal in sel) { /*do stuff*/ }
Ho notato che se uso
IEnumerable
, quando eseguo il debug e ispeziono "sel", che in quel caso è IEnumerable, ha alcuni membri interessanti: "inner", "outer", "innerKeySelector" e "outerKeySelector", questi ultimi 2 appaiono essere delegati. Il membro "interno" non contiene istanze "Animali", ma piuttosto istanze "Specie", il che è stato molto strano per me. Il membro "esterno" contiene istanze "Animali". Presumo che i due delegati determinino quale entra e cosa ne esce?Ho notato che se uso "Distinto", "interno" contiene 6 elementi (questo non è corretto poiché solo 2 sono Distinti), ma "esterno" contiene i valori corretti. Ancora una volta, probabilmente i metodi delegati determinano questo, ma questo è un po 'più di quanto io sappia di IEnumerable.
Ancora più importante, quale delle due opzioni è la migliore in termini di prestazioni?
La conversione della Lista del male tramite .ToList()
?
O forse usando direttamente l'enumeratore?
Se puoi, spiega anche un po 'o lancia alcuni link che spiegano questo uso di IEnumerable.