1

OrderedDictionary クラスの拡張としてオーバーロードされた Add メソッドを作成しようとしていますが、カリー化された述語に基づいてキー/値を追加したいと考えています。

呼び出しコードは次のようになります。


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

しかし、「Predicate を bool に変換できません」というコンパイラ エラーが表示されるため、機能しません。

誰かが私が欠けているものを知っていますか?

助けてくれてありがとう。-キース

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 に答える