【问题标题】:Problem with Predicates in C#C#中的谓词问题
【发布时间】:2011-07-12 00:53:23
【问题描述】:

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

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&lt;T&gt; 的例子都有一个硬编码的比较器。我需要将找到的key's 值与values 中的每个项目进行比较。但是,我无法传递这些值。

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

我错过了什么吗?

【问题讨论】:

  • 这里的类型参数T有什么意义?
  • 另外,如果values是一个通用列表,但是会包含一个你需要匹配的字符串,你的意思是你需要匹配values中对象的一个​​字符串属性,或者什么?请澄清。
  • " 但是,值是通用的(显然会包含我需要匹配的字符串)。"我需要完全符合你所说的。

标签: c# .net c#-4.0 delegates predicates


【解决方案1】:

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

选项 1 是使用 Func&lt;string, T1, bool&gt; 而不是 Predicate&lt;T1&gt;。这样谓词可以根据需要在字符串和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&lt;T1, string&gt; 参数,将查找到的字符串转换为 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)

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

【讨论】:

  • 一开始很天真,但变得有点复杂,然后成长为想要学习如何正确地做到这一点。在这种情况下,也许最好不要太笼统。
猜你喜欢
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
相关资源
最近更新 更多