将两个LINQ表达式合并为一个

时间:2016-10-13 20:22:36

标签: c# linq

在这种情况下,我有两个不同的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; }
}

2 个答案:

答案 0 :(得分:6)

使用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 == 6result.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;
    });
}

答案 1 :(得分:0)

您可以使用Tuple<int, int>

执行此操作
var result = new Tuple<int, int>(Products.Count, Products.Where(x => x.ID < 2).Count());

请注意使用具有O(1)复杂度而不是O(N)的Products.Count属性,因此您不必担心此实现的性能。如需进一步阅读,您可以查看this post