29

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

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

4

7 に答える 7

24

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

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

于 2008-09-17T09:52:27.297 に答える
19

for/foreach ループに問題はありません。とにかく、AddRange メソッドが実行する仮説上のすべてです。

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

于 2008-09-17T10:48:26.927 に答える
3

楽しみのために、この拡張メソッドをディクショナリに作成しました。これにより、可能な限りディープ コピーが実行されます。

public static Dictionary<TKey, TValue> DeepCopy<TKey,TValue>(this Dictionary<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;
        }
于 2008-09-17T15:14:08.270 に答える
0

Dictionary( Dictionary ) を使用しない理由がわかりません ( ageektrapped で提案されているように)。

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

新しいオブジェクトを指す新しいDictionaryを作成したい場合、唯一の方法はforeachを使用することだと思います。

于 2008-09-17T09:58:53.850 に答える
0

2 つの既存のオブジェクトを扱っている場合は、CopyTo メソッドを使用してマイレージを得ることができます: http://msdn.microsoft.com/en-us/library/cc645053.aspx

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

于 2008-09-17T09:57:54.863 に答える