1

我正在尝试创建一个重载的 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);
        }
    }
}

但它不起作用,因为我收到编译器错误“无法将谓词转换为布尔值”。

有谁知道我错过了什么?

谢谢你的帮助。-基思

4

1 回答 1

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);
于 2010-01-23T18:52:03.543 回答