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

null を返します。

ネストされた 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にならないCollection<T>ため、演算子の結果asは null になります。

于 2009-09-16T13:45:24.697 に答える
2

SelectManyを使ってみましたか? あなたの質問に基づいて、それはあなたが探しているもののように聞こえます。

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