用C#将值和键从一个字典复制到另一个字典中的最快方法是什么?

用C#将值和键从一个字典复制到另一个字典中的最快方法是什么?

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

似乎没有dictionary.AddRange()方法。 有谁知道一种更好的方式而不使用foreach循环将项目复制到另一本词典。

我正在使用System.Collections.Generic.Dictionary。 这是用于.NET 2.0。


Dictionary构造函数带有另一个Dictionary

您必须将其强制转换为IDictionary,但是有一个Add()重载占用了KeyValuePair。但是,您仍在使用foreach。


for / foreach循环没有错。假设的方法AddRange都是这样。

我唯一需要担心的是内存分配行为,因为添加大量条目可能会导致多个重新分配和重新哈希。无法通过给定数量增加现有词典的容量。您最好为两个当前词典分配足够的容量来分配一个新的Dictionary,但是您仍然需要循环才能加载至少其中一个。


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

可以将现有的动物词典传递给构造函数。

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

为了好玩,我创建了这个扩展方法到字典。这应该尽可能进行深层复制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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;
        }

我不明白,为什么不使用Dictionary(Dictionary)(如ageektrapped所建议)。

您要执行浅拷贝还是深拷贝? (也就是说,两个Dictionary是否都指向新字典中每个对象的相同引用或新副本?)

如果要创建一个指向新对象的新Dictionary,我认为唯一的方法是通过foreach。


如果要处理两个现有对象,则使用CopyTo方法可能会有所帮助:http://msdn.microsoft.com/zh-cn/library/cc645053.aspx

使用其他集合(接收者)的Add方法吸收它们。


推荐阅读