将带籽的林克骨料翻转过来

本文关键字:翻转 转过来 林克 | 更新日期: 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更好的名字。我已经考虑了TransformMapApply

将带籽的林克骨料翻转过来

返回所有产品p,其中所有条件c在通过p:时返回true

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