我有以下方法定义(已编辑以删除冗余通用):
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
中每一项的值(value).但是,我无法传递这些值。
我看不出如何使用基于委托(delegate)的匹配方法在 foreach 循环之外执行此操作。
我是不是漏掉了什么?
最佳答案
在我看来,您有两个选择,无需更改疯狂的要求。
选项 1 是使用 Func<string, T1, bool>
而不是 Predicate<T1>
.这样谓词就可以根据需要在字符串和T1之间进行转换,并返回 bool 匹配结果。
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)
虽然这两种情况都不太理想。这个函数听起来更像是寻找解决方案的问题,而不是反过来。签名有点疯狂,似乎可以通过重申要求或将其分解成多个部分来大大简化它。
关于c# - C# 中的谓词问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6658403/