我想在列表中获取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来从这些记录中获取值。答案小组最适合我。总体方式非常有趣,我认为还有其他用途。
答案 0 :(得分:9)
此解决方案仅使用Aggregate()
对列表进行一次迭代,但对于空列表,它将返回种子值。顺便说一下,种子值为int.MaxValue
和int.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()