C#中关于谓词的问题

3

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

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的值与values中的每个项进行比较。但是,我不能传递这些值。
我看不到可以在委托基于匹配方法的foreach循环之外完成此操作的方法。 我在这里错过了什么吗?

2
这里的类型参数T有什么意义? - FishBasketGordo
2
另外,如果“values”是一个通用列表,但将包含您需要匹配的字符串,您是否意味着您需要匹配“values”中对象的字符串属性,还是什么?请澄清。 - FishBasketGordo
1
然而,values是通用的(显然会包含我需要匹配的字符串)。我需要精确匹配你所说的内容。 - IamIC
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)

但这两种情况都不是理想的。这个函数看起来更像是在寻找解决方案而不是反过来。函数签名有点混乱,似乎可以通过重新陈述要求或将其分解成几个部分来大大简化。


它最初是无辜的,但变得有点复杂,然后渐渐想要学习如何正确地做。也许在这种情况下更好的做法是不那么泛泛而谈。 - IamIC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接