3

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

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

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

然而,Predicate<T>我见过的每个例子都有一个硬编码的比较器。我需要将找到的key's值与values. 但是,我无法传递这些值。

我看不到如何使用基于委托的匹配方法在 foreach 循环之外执行此操作。

我在这里错过了什么吗?

4

1 回答 1

5

在我看来,您有两种选择,而无需改变疯狂的要求。

选项 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)

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

于 2011-07-12T01:01:22.427 回答