C# 用种子翻转Linq骨料
我正在寻找与C# 用种子翻转Linq骨料,c#,linq,C#,Linq,我正在寻找与聚合等价的重载,它接受一个种子,但从种子扩展而不是从聚合集合扩展。也就是说,给定一个Func(适合在中使用,其中)集合,我希望将它们依次应用于基本集合。因此,考虑到这种设置: class Product { public int Name { get; set; } public int Size { get; set; } public int Price { get; set; } } var products = new List<Product
聚合
等价的重载,它接受一个种子,但从种子扩展而不是从聚合集合扩展。也就是说,给定一个Func
(适合在中使用,其中)集合,我希望将它们依次应用于基本集合。因此,考虑到这种设置:
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 enumerable.WhereAll(conditions);
这是我必须为之编写自己的扩展方法,还是有一种方法可以通过本机Linq扩展方法实现这一点?我认为在没有真正的聚合发生的情况下,Aggregate
语法可能会令人困惑(至少,开发人员会如何看待它)。如果我确实使用了Aggregate
,我认为这在代码中会令人惊讶或困惑,首先是因为没有发生真正的聚合(例如求和或连接),其次是因为当conditions
为空集合时,它仍然返回种子(对于使用集合和扩展方法来说,这是一个有点不习惯的、令人惊讶的结果,其中返回值不是扩展方法操作的对象的转换)
我愿意使用比更好的名称,wherell
。我考虑过转换
,映射
,和应用
,这将返回所有产品p
,其中所有条件c
在传递时返回truep
:
products.Where(p => conditions.All(c => c(p)));
谢谢@Rahul,我点击了错误的标签建议!Wherell怎么办?
?没有像这样的东西存在,所以你应该自己写。@Daniel是的,当然。我说的是错误的。我一直是说在哪里
。谢谢。你在找产品吗。Where(p=>conditions.all(c=>c(p)))
?看起来@dasblinkenlight和我得到了相同的解决方案——如果他们发布答案,我会删除这个。这很好,我学到了一些东西。但我必须更加小心我的问题,因为这实际上是针对一个IQueryable
。答案太好了,问题错了。叹气。
products.Where(p => conditions.All(c => c(p)));