Помощь с предикатом <T>делегат - PullRequest
1 голос
/ 23 января 2010

Я пытаюсь создать перегруженный метод Add как расширение класса OrderedDictionary и хотел бы добавить ключ / значение на основе некоторого каррированного предиката.

Код вызова будет выглядеть так:


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 Ответ

3 голосов
/ 23 января 2010

Проблема в том, что вы не оцениваете свой предикат, чтобы проверить и проверить, удовлетворен ли предикат. Теперь из вашего вопроса не ясно, хотите ли вы, чтобы предикат проверял ключ или значение. Следующее проверяет ключ. Вы также должны рассмотреть возможность возврата метода 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;
    }
}

Usage;

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