我正在寻找等价的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
更好的名字。我考虑过Transform
,Map
和Apply
。
答案 0 :(得分:0)
这会返回所有产品p
,其中所有条件c
在传递p
后返回true:
products.Where(p => conditions.All(c => c(p)));