代码之家  ›  专栏  ›  技术社区  ›  djskinner

LINQ聚合与嵌套foreach

  •  3
  • djskinner  · 技术社区  · 15 年前

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

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

    返回null。

    我对使用嵌套foreach没有异议,但我的本能是使用聚合,我不明白为什么它不能产生相同的结果。

    2 回复  |  直到 15 年前
        1
  •  11
  •   Jon Skeet    15 年前

    你应该使用 SelectMany

    ScheduleItems.SelectMany(s => s.ScheduleModules)
    

    这与初始嵌套的foreach循环完全匹配。它还等效于此查询表达式:

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

    ).

    为什么呢 Aggregate 不起作用:您正在呼叫返回 IEnumerable<T> ,然后使用 as 尝试将其转换为 Collection<T> . 结果 Union 不会是一场灾难 收藏<T> 作为 运算符为空。

        2
  •  2
  •   Scott Ivey    15 年前

    你试过使用吗 SelectMany ? 根据你的问题,这听起来像是你在寻找的。

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