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?

Était-ce utile?

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top