我有以下方法定义(EDITED以删除冗余通用):
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
中的每个项进行比较。但是,我无法传递这些值。
我无法看到如何使用基于委托的匹配方法在foreach循环之外执行此操作。
我在这里错过了什么吗?
答案 0 :(得分: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)
但这两种情况都不尽如人意。与其他方式相比,这个功能听起来更像是寻找解决方案的问题。签名有点疯狂,似乎可以通过重新定义要求或将其分解成碎片来大大简化。