0

このようなコードを見るたびに頭が痛くなります。誰がこれが何をしているのか説明できますか?

public static class MyExtensionFirADictionary
{
    public static TValue <TKey, TValue>(this IDictionary<TKey, TValue> dic, TKey key)
    { 
        TValue value;
        if (dic != null && dic.TryGetValue(key, out value))
            return value;

        return default(TValue);
    }
}
4

3 に答える 3

2

コンパイルエラーを無視すると、拡張メソッドを介して、「キーに対して保持されている値を返す - それ以外の場合は辞書のデフォルト値を返す」というだけです。名前は表示されていませんが、次のような方法で使用できます。

string name = nameLookup.GetValueOrDefault(userId);

コンパイラはジェネリックを暗黙的に処理することに注意してください。呼び出し元はそれらを指定する必要はありません。

最初に、コードはディクショナリが null かどうかをチェックします。null の場合は、デフォルト値を返します。

TryGetValue は、検索を実行し、機能した場合は true を返す標準の辞書メソッドです。コードはそのメソッドを使用し、フェッチされた値があればそれを返します。それ以外の場合は、TValue のデフォルト値を明示的に使用します。

于 2013-06-08T20:15:52.463 に答える
2

素人用語

//まず、サンプルの拡張メソッドにメソッド名を追加してコンパイルします

public static class MyExtensionFirADictionary
{
   public static TValue GetGenericValue <TKey, TValue>(this IDictionary<TKey, TValue> dic, TKey key)
   { 
       TValue value;
       if (dic != null && dic.TryGetValue(key, out value))
           return value;

       return default(TValue);
   }
}

それでは、最初から始めましょう。

メソッドの署名:

       public static TValue GetGenericValue <TKey, TValue>(this IDictionary<TKey, TValue> dic, TKey key)

タイプ TValue のオブジェクトを返します。

Dictionary<string, int> dict = new Dictionary<string, int>();

この場合、あなたが電話した場合

dict.GetGenericValue("thekey");

TValue は int 型になります (注意して<string, int>、元のメソッドに関連付けます

理解すべき重要なアイデア:

ジェネリックはテンプレートと考えてください。TValue、TKey は、これを行うときに指定する単なるプレースホルダーです。

List<myclass>

HTH

于 2013-06-08T20:24:35.397 に答える
0

デフォルトのディクショナリ動作と同じ機能を使用できますが、使いやすくなっています。

var dictionary = new Dictionary<string, object>();

//add items to dictionary

したがって、デフォルトは次のようになります。

    if(dictionary.ContainsKey("someKey"))
    {
        var value = dictionary["someKey"];
    }

ただし、そのキーがなく、ContainsKey チェックを行わないと、例外がスローされます。拡張メソッドが行うことは、キーが存在するかどうかを確認する TryGetValue を実行し、存在する場合は値を返し、それ以外の場合は default(T) を返します。

新しい用途は次のようになります (拡張メソッドの名前が GetValue であると仮定します):

var value = dictionary.GetValue("someKey");

はるかに短くてきれいです。

于 2013-06-08T20:18:11.077 に答える