比较谓词
本文关键字:谓词 比较 | 更新日期: 2023-09-27 18:33:44
>我有一个谓词列表
public List<Func<Album, bool>> Predicates { get; set; }
我想检查列表是否包含特定的谓词。
我做的是这样的:
bool check = Predicates.Contains(x=>x.AlbumName == "Winter");
但这总是返回 false,即使列表中有这样的谓词。我认为这是因为谓词是匿名方法,每个方法都是独一无二的,但仍然可以以某种方式比较它们?
恐
怕答案基本上是"不"。如果你有表达式树而不是委托,那么你可能会将它们与工作量进行比较,但基本上你有对不同方法的引用。您需要检查方法中的 IL,以比较它们是否相同。
当然,如果你有一组谓词操作的对象,你可以找出你是否有任何谓词与你的"目标"谓词匹配的相同子集,但这与测试谓词是否真的相同是不一样的。
谓词比较是完全可能的。你做错的是你正在使用 lambda 表达式,基本上为每个谓词声明新方法(AND 用于它们的比较)!:)
使用普通函数代替 lambda。
例如,声明:bool AlbumNameFilter(Album album) {return album.Name == "Winter";}
您将能够将AlbumNameFilter
添加到Predicates
列表中,并在以后Find
:
Predicates.Contains(AlbumnameFilter);
切换到表达式<函数><专辑、布尔>>列表并创建自定义比较函数>
您可以使用字典而不是列表。然后,您可以通过分配为键的任何内容来比较不同的谓词。
Dictionary<(YourKey), Predicate<Album>> predicates = new Dictionary<(YourKey), Predicate<Album>>;
....
if (!predicates.ContainsKey((YourKey)))
{
predicates.Add((YourKey), x => x.AlbumName == "Winter")
}
else
{
predicates.Remove((YourKey));
}
然后,要使用谓词,您只需访问字典值。