我想在列表中获取where子句的结果,然后获取该结果集并创建一个新类型,其所有字段都是从原始查询的聚合构造的.所以给定下面的基本示例,无论如何将两个linq语句合并为一个?如果原始的地方没有行,那么它应该返回null.谢谢!
class Foo { public int A { get; set; } public int B { get; set; } } Listlst = 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来从这些记录中获取值.答案小组最适合我.聚合方式非常有趣,我认为还有其他用途.
此解决方案仅对列表进行一次迭代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) });