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

StackOverflow https://stackoverflow.com/questions/81552

  •  09-06-2019
  •  | 
  •  

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

我正在使用 System.Collections.Generic.Dictionary。这是针对 .NET 2.0 的。

有帮助吗?

解决方案

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

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

其他提示

有的是 Dictionary 需要另一个的构造函数 Dictionary.

你必须投射它 IDictionary, ,但是有一个 Add() 过载需要 KeyValuePair<TKey, TValue>. 。不过,您仍在使用 foreach。

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

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

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

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

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

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

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

我不明白,为什么不使用字典( Dictionary )(按照ageektrapped的建议)。

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

如果你想创建一个 新的 字典指向 新的 对象,我认为唯一的方法是通过 foreach.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top