LINQ Aggregate与嵌套的foreach

时间:2009-09-16 13:39:16

标签: linq aggregate

我正在努力实现:

foreach (ScheduleItem s in ScheduleItems)
{
    foreach (IScheduleModule m in s.ScheduleModules)
    {
        yield return m;
    }
}

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

return ScheduleItems.Aggregate(new Collection<IScheduleModule>(), (x, o) => x.Union(o.ScheduleModules) as Collection<IScheduleModule>);

返回null。

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

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

2 个答案:

答案 0 :(得分:10)

您应该使用SelectMany

ScheduleItems.SelectMany(s => s.ScheduleModules)

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

from s in ScheduleItems
from m in s.ScheduleModules
select m

(虽然这会使用稍微不同的SelectMany形式)。

至于为什么Aggregate无法正常工作:您正在调用返回IEnumerable<T>的联盟,然后使用as尝试将其转换为Collection<T>Union的结果不会是Collection<T>,因此as运算符的结果为空。

答案 1 :(得分:2)

您是否尝试过使用SelectMany?根据您的问题,这听起来像您正在寻找的。

var results = ScheduleItems.SelectMany(si => si.ScheduleModules);