帮助Predicate <t>委托</t>

时间:2010-01-23 18:45:21

标签: 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 );
dict.Add("02","place", lenOf2);

我创建了一个类似的扩展方法:


public static class CollectionExtensions
{
    public static void Add(this OrderedDictionary s, string k, string v, Predicate p)
    {
        if (p)
        {
            d.Add(k, v);
        }
    }
}

但是它不起作用,因为我得到一个编译器错误,读取“无法将谓词转换为bool”。

有谁知道我错过了什么?

感谢您的帮助。 -Keith

1 个答案:

答案 0 :(得分:3)

问题在于您没有评估谓词以检查谓词是否满足。现在,从您的问题中不清楚您是否希望谓词测试密钥或值。以下检查密钥。您还应该考虑让方法返回bool表示成功或失败,就像我在这里所做的那样。

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("key", "value", s => s.Length < 5);

由于OrderedDictionary不是强类型的,因此您可以对此进行一般性概括。

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);