LINQ Aggregate与嵌套的foreach

djs*_*ner 3 linq aggregate

我想要实现:

foreach (ScheduleItem s in ScheduleItems)
{
    foreach (IScheduleModule m in s.ScheduleModules)
    {
        yield return m;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用LINQ聚合,我不明白为什么

return ScheduleItems.Aggregate(new Collection<IScheduleModule>(), (x, o) => x.Union(o.ScheduleModules) as Collection<IScheduleModule>);
Run Code Online (Sandbox Code Playgroud)

返回null.

我没有使用嵌套foreach的问题,但我的直觉是使用聚合,我不明白为什么它不会产生相同的结果.

还有其他方法吗?在可读性和性能方面最好的是什么?

Jon*_*eet 10

你应该用SelectMany这个:

ScheduleItems.SelectMany(s => s.ScheduleModules)
Run Code Online (Sandbox Code Playgroud)

这与您初始嵌套的foreach循环完全匹配.它也等同于这个查询表达式:

from s in ScheduleItems
from m in s.ScheduleModules
select m
Run Code Online (Sandbox Code Playgroud)

(虽然这将使用略有不同的形式SelectMany).

至于为什么Aggregate不工作:你正在调用Union返回一个IEnumerable<T>,但后来as尝试将其转换为Collection<T>.结果Union将不是a Collection<T>,因此as运算符的结果为null.