我在自定义类中有一组数据点。我还有许多不同的条件需要在整个应用程序中以不同的组合进行测试,我想将这些条件定义为表达式。假设我的收藏有产品。
代替写作
Products.Where(p => p.IsOnSale && p.Color == Color.Blue && p.Quality > 0);
为了清楚起见,我希望能够做的是在一个地方定义谓词:
Expression<Func<Product, bool>> OnSale = (p) => p.IsOnSale;
Expression<Func<Product, bool>> Blue = (p) => p.Color = Color.Blue;
Expression<Func<Product, bool>> InStock = (p) => p.Quantity > 0;
....
然后使用这些谓词过滤我的集合:
Products.Where(OnSale).And(Blue).And(InStock);
或
Products.And(OnSale, Blue, InStock);
所以我可以很容易地看到我返回的是什么,我只定义一次条件,如果任何条件发生变化,我可以只更新谓词而不是我正在做的每个地方都做一个 Where()。
我怎样才能做到这一点?我查看了 PredicateBuilder,但 Linq.Expressions 对我来说是全新的。
最佳答案
不用任何额外的工作,您可以使用:
Products.Where(OnSale).Where(Blue).Where(InStock);
... Where
调用自然组成“And”。或者,PredicateBuilder
让它变得非常简单:
Products.Where(OnSale.And(Blue).And(InStock));
这只需要 PredicateBuilder
可以使用合适的 using 指令来获取其扩展方法。
关于c# - Linq 表达式的自定义 And() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9097676/