题
我要带一个列表上的where子句的结果,然后采取这一结果集,并只创建一个新类型,有它的所有原始查询的聚集建造领域。所以,下面给出基本的例子,反正是有2个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子句后的结果集是非常小的。历数在第二组几次不应该是一个问题。此外,我需要的第一个和最后使用的设置,以获得从这些记录的值。通过回答该小组将工作最适合我的。聚集的方式很有趣,我认为有另一种用法为。
解决方案
( 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()
其他提示
此溶液与Aggregate()
遍历该列表仅一次,但对于空列表它将返回的种子值。顺便说,该种子值是int.MaxValue
和int.MinValue
因为Math.Min(int.MaxValue, C)
将始终返回C和同样Math.Max(int.MinValue, 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)
});
不隶属于 StackOverflow