我正在努力实现:
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没有问题,但我的直觉是使用聚合,我不明白为什么它不会产生相同的结果。
还有其他方法吗?在可读性和性能方面最好的是什么?
答案 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?根据您的问题,这听起来像您正在寻找的。 p>
var results = ScheduleItems.SelectMany(si => si.ScheduleModules);