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

时间:2020-03-05 18:58:26  来源:igfitidea点击:

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

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

解决方案

回答

Dictionary构造函数需要另一个Dictionary

我们必须将其强制转换为IDictionary,但是Add()重载将采用KeyValuePair <TKey,TValue>。但是,我们仍在使用foreach。

回答

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

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

回答

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

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

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

回答

for / foreach循环没有错。无论如何,这就是假设的AddRange方法要做的全部。

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

回答

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

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