2012-02-16 14 views
0

私はC#と辞書を使用することで非常に新しいです。 KeyがタイプGroupのオブジェクトである辞書のKeyを編集したいと思います。グループには1つのパブリックプロパティGroupNameが含まれます。 GroupNameを新しい文字列値に変更する必要があります。私たちはキーとして文字列ではなくオブジェクトを使用する必要があります。私は以下を試した:辞書のオブジェクト型のキーを更新する

***************************SEPERATE COLLECTION CLASS************************ 
{ 

    public class GroupKeysDictionary : Dictionary<Group, List<Key>> { } 
} 
************************************************************************* 


private static GroupKeysDictionary _groupKeys = new GroupKeysDictionary(); 


public static class DataAccessMgr {  
    (Group g contains the original g. 
    GroupName and k.GroupName is the new group name)  
    public static void EditGroup(Group g, Group k) { 
     if (_groupKeys.ContainsKey(g)) { 
      _groupKeys(g) = k 
     } 
    } 

私はグループを削除して再追加する必要がありますか? 私はリストの値を失いたくありません。

答えて

0

はい、忘れずにキーを削除してから追加してください。

辞書の背後にあるアイデアは、キーが辞書に入ったら変更しないことです。それを突然変異させないでください。キーが実質的な方法で変更された場合、キーのハッシュコードが無効になり、辞書が効果的に無効になります。値を別のキーに再関連付けする場合は、元のキーを使用して値を取得し、キーを削除してから、新しいキーを値とともに辞書に追加して戻します。あなたがしようとする場合がありますどのような

if (_groupKeys.ContainsKey(g) && !_groupKeys.ContainsKey(k)) 
{ 
    var value = _groupKeys[g]; 
    _groupKeys.Remove(g); 
    _groupKeys.Add(k, value); 
} 

*この答えはあなたのGroupクラスを考慮にあなたの選ばれたプライマリプロパティ、GroupNameを取り、自身のGetHashCodeEqualsメソッドを実装していることを前提としています。クラスがそのような実装を提供せず、むしろデフォルトの参照平等に頼っている場合、キーの突然変異は同じ有害な効果を持ちません。しかし、同じ意味の2つの別個のインスタンスが同じ意味ではないので、キーとして使用することができるので、あなたの辞書はそれほど有用ではありません。

+0

これは拡張メソッドに属しているようです。 –

+0

ヘルプとコードサンプルをありがとう。私はそれを試してみましょう。 –

+0

@ M.Babcock、確かに、回答を提供するのは難しいです(もし誰かが好きなだけで拡張メソッドに入れることはできますが、おそらく 'public static bool ReplaceKey (このDictionary 辞書、TKey originalKey、TKey newKey) 'メソッドがキーをスワップすることができる場合はtrue/falseを返します)、現在は拡張メソッドをすべて自由に宣言する気にはなりません。 –

関連する問題