将带籽的林克骨料翻转过来
本文关键字:翻转 转过来 林克 | 更新日期: 2023-09-27 18:21:39
我正在寻找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
。
返回所有产品p
,其中所有条件c
在通过p
:时返回true
products.Where(p => conditions.All(c => c(p)));