web-dev-qa-db-ja.com

C#で1つの辞書から別の辞書に値とキーをコピーする最も速い方法は何ですか?

Dictionary.AddRange()メソッドがないようです。 foreachループを使用せずにアイテムを別の辞書にコピーするためのより良い方法を知っている人はいますか?.

System.Collections.Generic.Dictionaryを使用しています。これは.NET2.0用です。

27
Helephant

For/foreachループに問題はありません。とにかく、これがすべて架空のAddRangeメソッドで実行されることです。

多数のエントリを追加すると、複数の再割り当てと再ハッシュが発生する可能性があるため、私が抱える唯一の追加の懸念は、メモリ割り当ての動作に関するものです。既存の辞書の容量を指定された量だけ増やす方法はありません。現在の両方に十分な容量の新しい辞書を割り当てる方がよい場合もありますが、少なくとも1つをロードするにはループが必要です。

17
Mike Dimmick

別のDictionaryを取るDictionaryコンストラクタがあります。

IDictionaryをキャストする必要がありますが、_KeyValuePair<TKey, TValue>_をとるAdd()オーバーロードがあります。ただし、まだforeachを使用しています。

21
ageektrapped
var Animal = new Dictionary<string, string>();

既存の動物辞書をコンストラクターに渡すことができます。

Dictionary<string, string> NewAnimals = new Dictionary<string, string>(Animal);
9
Mahendra Thorat

楽しみのために、私はこの辞書への拡張メソッドを作成しました。これにより、可能な限りディープコピーを実行する必要があります。

public static Dictionary<TKey, TValue> DeepCopy<TKey,TValue>(this Dictionary&lt;TKey, TValue> dictionary)
        {
            Dictionary<TKey, TValue> d2 = new Dictionary<TKey, TValue>();

            bool keyIsCloneable = default(TKey) is ICloneable;
            bool valueIsCloneable = default(TValue) is ICloneable;

            foreach (KeyValuePair<TKey, TValue> kvp in dictionary)
            {
                TKey key = default(TKey);
                TValue value = default(TValue);
                if (keyIsCloneable)
                {
                    key = (TKey)((ICloneable)(kvp.Key)).Clone();
                }

                else
                {
                    key = kvp.Key;
                }

                if (valueIsCloneable)
                {
                    value = (TValue)((ICloneable)(kvp.Value)).Clone();
                }

                else
                {
                    value = kvp.Value;
                }

                d2.Add(key, value);
            }

            return d2;
        }
3
BFree

既存の2つのオブジェクトを処理している場合は、CopyToメソッドを使用すると多少のメリットがあります。 http://msdn.Microsoft.com/en-us/library/cc645053.aspx

他のコレクション(レシーバー)のAddメソッドを使用して、それらを吸収します。

0
Oli

私は理解していません、(ageektrappedによって提案されたように)なぜDictionary(Dictionary)を使用しないのですか?.

浅いコピーと深いコピーのどちらを実行しますか? (つまり、両方のディクショナリが、新しいディクショナリ内のすべてのオブジェクトの同じ参照または新しいコピーを指していますか?)

newオブジェクトを指すnewディクショナリを作成する場合は、唯一の方法はforeachを使用することだと思います。

0