c# - C# 中的谓词问题

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

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

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/

相关文章:

c# - 确定打开了哪个标签页

c# - 将数据从(大)文件 Excel 导入到 datagridview,然后导入数据库 - 为什么插入到数据库需要这么长时间并且不保存所有数据?

c# - 如何将字符串值分配给枚举并在开关中使用该值

c# - SQL CLR UDT 的 ToString() 给出了一个奇怪的结果

c# - 使用 .NET 的 Toggl API v8

asp.net - 数据绑定(bind) : 'System.Data.DataRowView' does not contain a property with the name 'ProductID'

c# - 如何阅读 MVC OWIN AuthenticationProperties?

c# - WPF 用户控件父级

c# - 禁用粗体按钮

visual-studio-2010 - 如何在 C# 中设置用作小数点的字符?