J'ai des doutes sur le fonctionnement des énumérateurs et LINQ. Considérez ces deux sélections 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();
J'ai changé les noms de mes objets d'origine pour que cela ressemble à un exemple plus générique. La requête elle-même n'est pas si importante. Ce que je veux demander, c'est ceci:
foreach (Animal animal in sel) { /*do stuff*/ }
J'ai remarqué que si j'utilise
IEnumerable
, quand je débogue et inspecte "sel", qui dans ce cas est l'IEnumerable, il a des membres intéressants: "inner", "external", "innerKeySelector" et "externalKeySelector", ces 2 derniers apparaissent être délégués. Le membre "intérieur" ne contient pas d'instances "Animal", mais plutôt des instances "Espèce", ce qui était très étrange pour moi. Le membre "externe" contient des instances "Animal". Je suppose que les deux délégués déterminent ce qui entre et ce qui en sort?J'ai remarqué que si j'utilise "Distinct", le "intérieur" contient 6 éléments (c'est incorrect car seulement 2 sont distincts), mais le "extérieur" contient les valeurs correctes. Encore une fois, les méthodes déléguées déterminent probablement cela, mais c'est un peu plus que ce que je sais sur IEnumerable.
Plus important encore, laquelle des deux options est la meilleure en termes de performances?
La conversion de liste mal via .ToList()
?
Ou peut-être utiliser directement l'énumérateur?
Si vous le pouvez, veuillez également expliquer un peu ou lancer des liens qui expliquent cette utilisation de IEnumerable.