3

IDictionary<TKey, TValue> [key]キーが辞書に存在しない場合に例外をスローする方法が時々本当に嫌いです。

もちろんありますがTryGetValue()、それは使いやすさではなく、パフォーマンスのために最適化されているようです。

だから私は、ああ、それのための拡張メソッドを作るだけだと思った-私はそれをした:

public static class CollectionExtensions
{
    public static TType GetValueOrDefault<TKeyType, TValue, TType>(this IDictionary<TKeyType, TType> dictionary, TKeyType key)
    {
        TType value = default(TType);

        // attempt to get the value of the key from the dictionary
        // if the key doesn't exist just return null
        if (dictionary.TryGetValue(key, out value))
        {
            return value;
        }
        else
        {
            return default(TType);
        }
    }    
}

これは、型推論が機能していないように見えることを除いて、正常に機能します。

明らかに、私は次のことができるようにしたい:

var extraDataLookup = new Dictionary<string, string>();
extraDataLookup["zipcode"] = model.Zipcode; 

そして、値にアクセスできるようにします:

var zipcode = extraDataLookup.GetValueOrDefault("zipcode");
var foo = extraDataLookup.GetValueOrDefault("foo"); // should be null

Jon Skeet の記事やソースコードをSystem.Linq.Enumerableリフレクター含めて、型推論についていくつか調べましたが、何かが欠けているようです。

これは機能します:

extraDataLookup.GetValueOrDefault<string, string,string> ("foo") 

しかし、これはそうではありません

extraDataLookup.GetValueOrDefault ("foo") 

私は何をすべきか。

PS。私はジェネリック型推論の問題に対する解決策を探しているだけで、他の提案はありません。ありがとう。

4

1 に答える 1

5

2 つしか必要ないのに、3 つのジェネリック型で拡張メソッドを定義しているようです。「TValue」と「TType」は同じ意味ですよね。これを試して:

public static TValue GetValueOrDefault<TKey, TValue>(
    this IDictionary<TKey, TValue> dictionary, TKey key)
{
    TValue value;
    // attempt to get the value of the key from the dictionary
    dictionary.TryGetValue(key, out value);
    return value;
}    
于 2009-02-03T04:34:06.440 に答える