Linq - 如何聚合另一个查询的结果

时间:2009-04-05 19:18:18

标签: c# linq aggregate

我想在列表中获取where子句的结果,然后获取该结果集并创建一个新类型,其所有字段都是从原始查询的聚合构造的。所以给定下面的基本示例,无论如何将两个linq语句合并为一个?如果原始的地方没有行,那么它应该返回null。谢谢!

    class Foo
    {
        public int A { get; set; }
        public int B { get; set; }
    }
    List<Foo> lst = GetFooList();

        var q = (from f in lst
                 where f.A > 3
                 select f).ToList();
        if (q.Count != 0)
        {
            var qq = new
            {
                MinA = q.Min(l => l.A),
                MaxB = q.Max(h => h.B),
            };
            // now do something with qq
        }

更新: 对于我的情况,原始集合有很多项目,但在where子句之后,结果集非常小。多次枚举第二组应该不是问题。此外,我需要在集合上使用first和last来从这些记录中获取值。答案小组最适合我。总体方式非常有趣,我认为还有其他用途。

2 个答案:

答案 0 :(得分:9)

此解决方案仅使用Aggregate()对列表进行一次迭代,但对于空列表,它将返回种子值。顺便说一下,种子值为int.MaxValueint.MinValue,因为Math.Min(int.MaxValue, C)将始终返回C,同样Math.Max(int.MinValue, C)将始终返回C.

var b = lst.Where(f => f.A > 3)
           .Aggregate(
                  // seed, initial values
                  new
                  {
                     MinA = int.MaxValue,
                     MaxB = int.MinValue
                  },

                  // accumulator function
                  (a,f) => new
                  {
                     MinA = Math.Min(a.MinA , f.A),
                     MaxB = Math.Max(a.MaxB , f.B)
                  });

答案 1 :(得分:2)

( from f in GetFooList()
  where f.A > 3
  group f by 1 into g
  let MinA=g.Min(l=>l.A)
  let MaxB=g.Max(h=>h.B)
  select new {MinA, MaxB} ).SingleOrDefault()