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

时间:2008-09-17 09:47:33

标签: c# dictionary copy foreach

似乎没有dictionary.AddRange()方法。有没有人知道在不使用foreach循环的情况下将项目复制到另一个字典的更好方法。

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

7 个答案:

答案 0 :(得分:21)

Dictionary构造函数需要另一个Dictionary

您必须将其IDictionary投射,但Add()重载需要KeyValuePair<TKey, TValue>。不过,你还在使用foreach。

答案 1 :(得分:17)

for / foreach循环没有任何问题。无论如何,这都是假设的AddRange方法。

我唯一需要关注的是内存分配行为,因为添加大量条目可能会导致多次重新分配和重新散列。没有办法按给定的数量增加现有词典的容量。你可能最好分配一个具有足够容量的新词典用于当前的词典,但你仍然需要一个循环来加载至少其中一个。

答案 2 :(得分:9)

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

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

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

答案 3 :(得分:3)

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

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

答案 4 :(得分:0)

如果您正在处理两个现有对象,您可能会使用CopyTo方法获得一些里程:http://msdn.microsoft.com/en-us/library/cc645053.aspx

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

答案 5 :(得分:0)

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

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

如果您想创建一个指向 new 对象的 new 词典,我认为唯一的方法是通过 foreach

答案 6 :(得分:0)

对于原始类型字典:

public void runIntDictionary()
{
    Dictionary<int, int> myIntegerDict = new Dictionary<int, int>() { { 0, 0 }, { 1, 1 }, { 2, 2 } };
    Dictionary<int, int> cloneIntegerDict = new Dictionary<int, int>();
    cloneIntegerDict = myIntegerDict.Select(x => x.Key).ToList().ToDictionary<int, int>(x => x, y => myIntegerDict[y]);
}

或带有实现ICloneable的对象:

public void runObjectDictionary()
{
    Dictionary<int, number> myDict = new Dictionary<int, number>() { { 3, new number(3) }, { 4, new number(4) }, { 5, new number(5) } };
    Dictionary<int, number> cloneDict = new Dictionary<int, number>();
    cloneDict = myDict.Select(x => x.Key).ToList().ToDictionary<int, number>(x => x, y => myDict[y].Clone());
}

public class number : ICloneable
{
    public number()
    {
    }
    public number(int newNumber)
    {
        nr = newnumber;
    }
    public int nr;

    public object Clone()
    {
        return new number() { nr = nr };
    }
    public override string ToString()
    {
        return nr.ToString();
    }
}