使用

时间:2015-11-12 19:19:24

标签: c# linq

我正在寻找等价的Aggregate - 带有种子的重载 - 但是从种子延伸而不是从聚合集合延伸。也就是说,给定Func<T, bool>的集合(适用于Where),我希望将它们连续应用于基本集合。所以给定这个设置:

class Product {
    public int Name { get; set; }
    public int Size { get; set; }
    public int Price { get; set; }
}

var products = new List<Product> {
    new Product { Name = "toaster", Size = 100, Price = 49 },
    new Product { Name = "pencil", Size = 2, Price = 5 },
    new Product { Name = "Oven", Size = 500, Price = 1000 }
}.AsEnumerable();

var conditions = new List<Func<Product, bool>> {
    { o => o.Size > 50 },
    { o => o.Price < 100 }
}.AsEnumerable();

而不是:

return conditions.Aggregate(enumerable, (current, condition) => current.Where(condition));

我希望能够使用:

return enumerable.WhereAll(conditions);

这是我必须编写自己的扩展方法,还是有办法用本机Linq扩展方法实现这一点?我认为Aggregate语法在没有发生真正聚合的情况下会令人困惑(至少,开发人员会如何思考)。如果我确实使用Aggregate,我认为在代码中会出现令人惊讶或混乱,首先是因为没有真正的聚合发生(例如求和或连接),其次是因为当conditions是一个空的集合,它仍然返回种子(使用集合和扩展方法的一些非惯用和令人惊讶的结果,其中返回值不是扩展方法操作的对象的转换)。

我可以接受比WhereAll更好的名字。我考虑过TransformMapApply

1 个答案:

答案 0 :(得分:0)

这会返回所有产品p,其中所有条件c在传递p后返回true:

products.Where(p => conditions.All(c => c(p)));