C# 谓词帮助<;T>;代表

C# 谓词帮助<;T>;代表,c#,functional-programming,predicate,C#,Functional Programming,Predicate,我试图创建一个重载的Add方法作为OrderedDictionary类的扩展,并希望基于一些curried谓词添加键/值 调用代码如下所示: OrderedDictionary dict = new OrderedDictionary(); Predicate<int> lessThan5 = i=>; i < 5; Predicate<string> lenOf2 = s=> s.length == 2; dict.Add("01","Name", lessThan5

我试图创建一个重载的Add方法作为OrderedDictionary类的扩展,并希望基于一些curried谓词添加键/值

调用代码如下所示:


OrderedDictionary dict = new OrderedDictionary();

Predicate<int> lessThan5 = i=>; i < 5;
Predicate<string> lenOf2 = s=> s.length == 2;

dict.Add("01","Name", lessThan5 );
dict.Add("02","place", lenOf2);
但它不起作用,因为我得到一个编译器错误,读取“不能将谓词转换为bool”

有人知道我错过了什么吗

谢谢你的帮助。
-Keith

问题在于,您没有评估谓词以检查谓词是否满足。现在,您的问题不清楚您是否希望谓词测试键或值。下面的代码检查密钥。您还应该考虑方法返回<代码>布尔O/COM>指示成功或失败,正如我在这里所做的。

static class OrderedDictionaryExtensions {
    public static bool Add(
        this OrderedDictionary dictionary,
        string key,
        string value,
        Predicate<string> predicate
    ) {
        if (dictionary == null) {
            throw new ArgumentNullException("dictionary");
        }
        if (predicate == null) {
            throw new ArgumentNullException("predicate");
        }
        if (predicate(key)) {
            dictionary.Add(key, value);
            return true;
        }
        return false;
    }
}
用法:

// dictionary is OrderedDictionary
dictionary.Add(17, "Hello, world!", i => i % 2 != 0);

+1不过,通过直接说明OP代码的错误可以改进好的示例:
如果
接受bool,那么不要传递任何其他内容。谓词应该有一个类型参数。必须显式调用委托(并传递任何必需的参数)才能执行委托-正如您所说,我们应该测试键还是值?如果我们说不出来,编译器怎么可能呢?谢谢,杰森。我不熟悉函数式编程的概念,所以如果我不清楚,请原谅我。谓词值应该与键或值参数无关。我想让谓词函数转换一个值。我想这样做:Predicate showPlaces=newpredicate(u=>u.isAllowed);Preicate showPeople=新谓词(i=>i==5);然后将showPlaces或showPeople谓词作为参数传递给一个方法,该方法将在不传递任何参数的情况下对其求值。。。如果(p)d添加(k,v)@未知(google):谓词是将某些集合映射到
{true,false}
的函数。谓词没有真值;通过在其域的某个成员处对其进行评估,可以从中获得真值。因此,当您说
Predicate p=new Predicate(i=>i==5)
时,您必须注意
p
没有真值。如果你想从
p
中得到一个真值,你必须在
int
处对它求值。现在,要使函数有效地保持一个参数不变。因此,对于一个只有一个参数开始的谓词,这意味着将谓词减少为单个值
true
false
。所以,如果这就是你想要的,为什么不让你上面的方法接受一个
bool
?但是,在这种情况下,你为什么还要调用这个方法呢?如果
bool
为false,不要麻烦调用
Add
,否则请调用
Add
。谓词值应该与键或值参数无关。我想让谓词函数转换一个值。类似这样:谓词showPlaces=新谓词(u=>u.isAllowed);谓词showPeople=新谓词(i=>i==5);然后将showPlaces或showPeople谓词作为参数传递给方法,该方法将在不传递任何参数的情况下对其求值。如果(p)d添加(k,v);“转换值的谓词”如何不仅仅是布尔值?你能解释一下吗?你说得对,埃里克。也许我想得太多了。
// dictionary is OrderedDictionary
dictionary.Add("key", "value", s => s.Length < 5);
static class OrderedDictionaryExtensions {
    public static bool Add<TKey, TValue>(
        this OrderedDictionary dictionary,
        TKey key,
        TValue value,
        Predicate<TKey> predicate
    ) {
        if (dictionary == null) {
            throw new ArgumentNullException("dictionary");
        }
        if (predicate == null) {
            throw new ArgumentNullException("predicate");
        }
        if (predicate(key)) {
            dictionary.Add(key, value);
            return true;
        }
        return false;
    }
}
// dictionary is OrderedDictionary
dictionary.Add(17, "Hello, world!", i => i % 2 != 0);