c#中的谓词问题

本文关键字:问题 谓词 | 更新日期: 2023-09-27 18:02:01

我有以下方法定义(编辑以删除多余的泛型):

public static T SearchAgaistValues<T>(Dictionary<string, string> input, 
string key, List<T> values, Predicate<T> match, out string[] cmdParams)

我的简化要求如下。我需要在input中搜索key,如果找到了,看看它的值是否出现在values中。但是,values是通用的(并且显然将包含我需要匹配的字符串)。因此,在我看来,我必须传递一个谓词方法来执行匹配。

但是,我见过的每个Predicate<T>示例都有一个硬编码比较器。我需要将发现的key's值与values中的每个项目进行比较。但是,我不能传递这些值。

我看不出如何在基于委托的match方法的foreach循环之外做到这一点。

我错过了什么吗?

c#中的谓词问题

在我看来,在不改变疯狂需求的情况下,您有两个选择。

选项1是使用Func<string, T1, bool>代替Predicate<T1>。这样,谓词就可以根据需要在字符串和T1之间进行转换,并返回布尔匹配的结果。

public static T1 SearchAgaistValues<T, T1>(
            Dictionary<string, string> input, 
            string key, 
            List<T1> values, 
            Func<string, T1, bool> match, 
            out string[] cmdParams)

或者,您可以传递一个额外的Converter<T1, string>参数来将查找的字符串转换为T1,然后使用谓词进行比较。

public static T1 SearchAgaistValues<T, T1>(
            Dictionary<string, string> input, 
            string key, 
            List<T1> values, 
            Converter<T1, string> converter,
            Predicate<T1> match, 
            out string[] cmdParams)

两种情况都不太理想。这个函数听起来更像是一个寻找解决方案的问题,而不是相反。这个签名有点疯狂,似乎可以通过重申需求或将其分解成几个部分来大大简化。