J'ai quelques doutes sur le fonctionnement des énumérateurs et de LINQ. Considérons 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 originaux 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 est ceci :
foreach (Animal animal in sel) { /*do stuff*/ }
-
J'ai remarqué que si j'utilise
IEnumerable
Lorsque je débogue et que j'inspecte "sel", qui dans ce cas est le IEnumerable, il possède quelques membres intéressants : "inner", "outer", "innerKeySelector" et "outerKeySelector", ces deux derniers semblent être des délégués. Le membre "inner" ne contient pas d'instances "Animal", mais plutôt des instances "Species", ce qui est très étrange pour moi. Le membre "outer" contient des instances "Animal". Je présume que les deux délégués déterminent ce qui entre et ce qui sort de ce membre ? -
J'ai remarqué que si j'utilise "Distinct", l'élément "inner" contient 6 éléments (ce qui est incorrect car seuls 2 sont Distinct), mais l'élément "outer" contient les valeurs correctes. Encore une fois, ce sont probablement les méthodes déléguées qui déterminent cela, mais c'est un peu plus que ce que je connais de IEnumerable.
-
Plus important encore, laquelle des deux options est la plus performante ?
La conversion de la Liste du mal via .ToList()
?
Ou peut-être en utilisant directement l'énumérateur ?
Si vous le pouvez, veuillez également expliquer un peu ou fournir des liens qui expliquent cette utilisation de IEnumerable.