比较谓词

问题描述 投票:4回答:3

我有一个谓词列表

public List<Func<Album, bool>> Predicates { get; set; }

我想检查列表是否包含特定谓词。

我这样做是:

bool check = Predicates.Contains(x=>x.AlbumName == "Winter");

但即使列表中有这样的谓词,这也总是返回false。我认为这是因为谓词是匿名方法,并且每种方法都是独一无二的,但仍然可以以某种方式比较它们吗?

c# predicate
3个回答
5
投票

我担心答案基本上是“不”。如果你有表达式树而不是委托,那么你可以用努力来比较它们,但基本上你已经引用了不同的方法。您需要检查方法中的IL,以比较它们是否相同。

当然,如果你有一组谓词运行的对象,你可以找出你是否有任何谓词与你的“目标”谓词匹配相同的子集,但这与测试谓词是否实际上是相同的不同。


0
投票

切换到Expression <Func <Album,bool >>列表并创建自定义比较器


0
投票

谓词比较是完全可能的。你做错了是你正在使用lambda表达式,基本上为每个谓词声明新方法(AND用于比较)! :)

而不是lambdas,使用普通函数。

例如,声明:bool AlbumNameFilter(Album album) {return album.Name == "Winter";}

您将能够将AlbumNameFilter添加到Predicates列表和Find以后:

Predicates.Contains(AlbumnameFilter);
© www.soinside.com 2019 - 2024. All rights reserved.