将两个LINQ表达式合并为一个
本文关键字:一个 合并 两个 LINQ 表达式 | 更新日期: 2023-09-27 18:12:54
在本例中,我有两个不同的LINQ表达式,用于在两个不同的条件下从Products获取计数。我只是好奇,如果有可能检索这两个计数从一个LINQ表达式?
class Program
{
static void Main(string[] args)
{
List<Product> Products = new List<Product>()
{
new Product() { ID = 1 },
new Product() { ID = 2 },
new Product() { ID = 3 },
new Product() { ID = 4 },
new Product() { ID = 5 },
new Product() { ID = 6 }
};
int all = Products.Count();
int some = Products.Where(x => x.ID < 2).Count();
}
}
public class Product
{
public int ID { get; set; }
}
使用Aggregate
可以避免对集合进行两次迭代:
var result = Products.Aggregate(new {a=0, s=0},(p,c) =>
{
return new { a = p.a + 1, s = c.ID < 2 ? p.s + 1 : p.s };
});
现在result.a == 6
和result.s == 2
你可以这样做:
public class CountResult
{
public int All { get; set; }
public int Some { get; set; }
}
public CountResult GetMyCount(IEnumerable<Product> products)
{
return products.Aggregate(new CountResult(), (p,c) =>
{
p.All++;
if (c.ID < 2) // or whatever you condition might be
{
p.Some++;
}
return p;
});
}
您可以使用Tuple<int, int>
:
var result = new Tuple<int, int>(Products.Count, Products.Where(x => x.ID < 2).Count());
请注意Products.Count
属性的使用,它具有O(1)复杂度而不是O(N),因此您完全不必担心此实现的性能。你可以查看这篇文章。