2

次のように、キー インデックスを使用して項目を Dictionary に割り当て/追加したいと考えました。

Dictionary<string, object> dict = new Dictionary<string, object>();
dict["key"] = dict["key"] ?? "object";

しかし、結果は次のようになります: 「指定されたキーは辞書に存在しませんでした。

null合体を使用して、セッションに値を割り当てる方法と同じように、この辞書に値を割り当てる方法はありますか?

Session["Member"] = Session["Member"] ?? new Member();

ありがとう

編集:私は実際にディクショナリの子クラスからインデクサーをオーバーライドしようとしましたが、役に立ちませんでした。IDictionary インターフェイスの実装は、以下のコードの機能 (つまり、キーが見つからない場合は null を返す) だけが必要なので、多すぎるように思えます。したがって、次のような拡張機能を使用できると思います。

public static TValue [this Dictionary<TKey, TValue> thisDictionary, TKey key] {
    get { return thisDictionary.ContainsKey(key) ? thisDictionary[key] : null; }
    set { thisDictionary[key] = value; }
}

しかし、それは機能していないか、コンパイルさえしていません。

このインデクサー機能を再利用するための他の簡単な方法はありますか? どうもありがとう。

4

2 に答える 2

1

ご指摘のとおり、不足しているキーを取得しようとすると例外がスローされます。最初にキーが存在するかどうかを確認する必要があります。

if( !Session.ContainsKey("Member") )
    Session["Member"] = new Member();

編集:

そしてあなたの質問に答えるために; 独自のインデクサーを作成するか、IDictionary インターフェイスを実装できます。このようにして、例外をスローするデフォルトの動作を回避できます

于 2010-06-25T06:04:00.300 に答える
1

これをインラインで実行する場合:

dict["key"] = dict.ContainsKey("key") ? (dict["key"] ?? "object") : "object"; 

または:

dict["key"] = dict.ContainsKey("key") && dict["key"] == null ? dict["key"] : "object";

コメントに従って編集します。

public static TValue GetSafe(this Dictionary<TKey, TValue> thisDictionary, TKey key) 
{ 
   if (!thisDictionary.ContainsKey(key))
       thisDictionary[key] = null;

   return thisDictionary[key];
}

これにより、次のことが可能になります。

thisDictionary["randomKey"] = thisDictionary.GetSafe("randomKey") ?? "someValue";
于 2010-06-25T06:05:43.437 に答える