4

現時点では、これ以外に方法がありません(間接的な更新):

private void UpdateKey(Dictionary<string,object> dict, string oldKey, string newKey){
    if(dict.ContainsKey(oldKey)){
          object value = dict[oldKey];
          dict.Remove(oldKey);
          dict.Add(newKey,value);
    }
}

他に良い方法はありますか?

もちろん、上記のメソッドは単なる単純なものです。例外をスローせずにうまく機能させるには、辞書内の既存のキーとの重複について newKey をチェックする必要があります。このような:

private void UpdateKey(Dictionary<string,object> dict, string oldKey, string newKey){
    if(dict.ContainsKey(oldKey)){
          object value = dict[oldKey];
          dict.Remove(oldKey);              
          dict[newKey] = value;
    }
}

事前にどうもありがとうございました!

4

3 に答える 3

10

TryGetValue代わりにメソッドを使用しますContains

private void UpdateKey(Dictionary<string,object> dict, string oldKey, string newKey){
    object value;
    if(dict.TryGetValue(oldKey, out value)){
          dict.Remove(oldKey);
          dict.Add(newKey, value);
    }
}

ただし、最初に値を取得し、別のキーで追加して、古いキーを削除する必要があります。他の方法ではできません。

ちなみに、メソッドをジェネリックにして、複数の辞書型を操作することができます。

private static void UpdateKey<TKye, TValue>(Dictionary<TKey, TValue> dict, TKey oldKey, TKey newKey){
    TValue value;
    if(dict.TryGetValue(oldKey, out value)){
          dict.Remove(oldKey);
          dict.Add(newKey, value);
    }
}

または、次のように独自の拡張メソッドを作成することもできますIDictionary<TKey, TValue>

public static class DictionaryExtensions
{
    public static void UpdateKey<TKye, TValue>(this IDictionary<TKey, TValue> dict, TKey oldKey, TKey newKey){
        TValue value;
        if(dict.TryGetValue(oldKey, out value)){
              dict.Remove(oldKey);
              dict.Add(newKey, value);
        }
    }
}

Dictionary次に、標準メソッドのように呼び出します。

myDict.UpdateKey(oldKey, newKey);
于 2013-04-27T18:11:23.927 に答える
2

キーの変更は単純な置換ではなく、内部ディクショナリ構造の再構築が必要な複雑な操作であるため、そのようなオプションはありません。

ディクショナリにそのようなメソッドがあれば、同じように削除して追加します。

コードを簡素化するために、それを行う拡張メソッドを作成できます。

于 2013-04-27T18:12:09.927 に答える
2

簡単に言えば、いいえ。削除して再度追加する必要があります。これを行うためのメソッドが組み込まれている場合は、同じことを行う必要があります。

あなたが求めていることを考えてみてください。削除と追加がこれを行う必要がある論理的な方法である理由がわかります。内部でディクショナリがどのように実装されるかを考えてみてください。キーを変更するとはどういう意味ですか?

まず、ディクショナリはエントリの構造体を保持します。各エントリは構造体であるため、値型であり、その場で更新することはできません。確かに、エントリは構造体ではなくオブジェクトとして表すことができますが、その目的は何でしょうか? 実際には限界的なエッジケースであるデータを処理するのは、効率の悪い方法です。

2 番目の基本レベルでは、ディクショナリはハッシュ値をアイテムにマッピングします。ハッシュの数は限られているため、実際にはバケットを使用してより複雑な方法でマッピングされます。これは、単純にその場で値を変更することはできないことを意味します (基礎となる構造でこれを行うことが許可されていたとしても)。この場合、基本的にしなければならないことは、キーとマッピングを削除してから追加し直すことです。その場合、コードはあなたが書いたものを実行しています。

一般に、キーは、この難しさのために正確に変更されることのない値に関するものであるべきであるため、あなたが書いたものを実行するための組み込みメソッドはありません (あなたが書いたものよりもきれいに行うことができると認められています) が、基本的な操作にはどこでどのように実装されているかに関係なく、削除して追加します。

ソースコードを見て、辞書が実際にどのように機能するかを詳しく見て、より深く理解してください。

于 2013-04-27T18:32:32.033 に答える