LINQ Aggregate vs nested foreach
Question
J'essaie d'atteindre:
foreach (ScheduleItem s in ScheduleItems)
{
foreach (IScheduleModule m in s.ScheduleModules)
{
yield return m;
}
}
en utilisant l'agrégat LINQ et je ne comprends pas pourquoi
return ScheduleItems.Aggregate(new Collection<IScheduleModule>(), (x, o) => x.Union(o.ScheduleModules) as Collection<IScheduleModule>);
renvoie null.
Je n'ai pas de problème à utiliser forfor imbriqué, mais mon instinct était d'utiliser l'agrégat et je ne comprends pas pourquoi cela ne produit pas le même résultat.
Existe-t-il d'autres approches? Quel est le meilleur en termes de lisibilité et de performance?
La solution
Vous devriez utiliser SelectMany
pour cela:
ScheduleItems.SelectMany(s => s.ScheduleModules)
Cela correspond exactement à votre boucle foreach imbriquée initiale. C'est également équivalent à cette expression de requête:
from s in ScheduleItems
from m in s.ScheduleModules
select m
(bien que cela utilise une forme légèrement différente de Aggregate
).
Quant à savoir pourquoi IEnumerable<T>
ne fonctionne pas: vous appelez Union qui renvoie un as
, mais vous utilisez ensuite Collection<T>
pour essayer de le convertir en Union
. Le résultat de <=> ne sera pas un <=>; par conséquent, le résultat de l'opérateur <=> est nul.
Autres conseils
Avez-vous essayé d'utiliser SelectMany ? Selon votre question, cela ressemble à ce que vous recherchez.
var results = ScheduleItems.SelectMany(si => si.ScheduleModules);