What's the fastest way to copy the values and keys from one dictionary into another in C#?

牧云@^-^@ 提交于 2019-12-13 12:52:57

问题


There doesn't seem to be a dictionary.AddRange() method. Does anyone know a better way to copy the items to another dictionary without using a foreach loop.

I'm using the System.Collections.Generic.Dictionary. This is for .NET 2.0.


回答1:


There's nothing wrong with a for/foreach loop. That's all a hypothetical AddRange method would do anyway.

The only extra concern I'd have is with memory allocation behaviour, because adding a large number of entries could cause multiple reallocations and re-hashes. There's no way to increase the capacity of an existing Dictionary by a given amount. You might be better off allocating a new Dictionary with sufficient capacity for both current ones, but you'd still need a loop to load at least one of them.




回答2:


There's the Dictionary constructor that takes another Dictionary.

You'll have to cast it IDictionary, but there is an Add() overload that takes KeyValuePair<TKey, TValue>. You're still using foreach, though.




回答3:


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

one can pass existing animal Dictionary to the constructor.

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



回答4:


For fun, I created this extension method to dictionary. This should do a deep copy wherever possible.

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;
        }



回答5:


If you're dealing with two existing objects, you might get some mileage with the CopyTo method: http://msdn.microsoft.com/en-us/library/cc645053.aspx

Use the Add method of the other collection (receiver) to absorb them.




回答6:


I don't understand, why not using the Dictionary( Dictionary ) (as suggested by ageektrapped ).

Do you want to perform a Shallow Copy or a Deep Copy? (that is, both Dictionaries pointing to the same references or new copies of every object inside the new dictionary?)

If you want to create a new Dictionary pointing to new objects, I think that the only way is through a foreach.



来源:https://stackoverflow.com/questions/81552/whats-the-fastest-way-to-copy-the-values-and-keys-from-one-dictionary-into-anot

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!