4

我正在努力实现:

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>);

返回空值。

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

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

4

2 回答 2

11

您应该SelectMany为此使用:

ScheduleItems.SelectMany(s => s.ScheduleModules)

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

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

(尽管这将使用稍微不同的形式SelectMany)。

至于为什么Aggregate不起作用:您正在调用 Union ,它返回一个IEnumerable<T>,但随后使用as尝试将其转换为Collection<T>. 的结果Union不会是 a Collection<T>,因此as运算符的结果为空。

于 2009-09-16T13:45:24.697 回答
2

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

var results = ScheduleItems.SelectMany(si => si.ScheduleModules);
于 2009-09-16T13:46:08.440 回答