it-swarm-ru.tech

Какой самый быстрый способ скопировать значения и ключи из одного словаря в другой в C #?

Кажется, нет словаря. Метод AddRange (). Кто-нибудь знает лучший способ скопировать элементы в другой словарь без использования цикла foreach. 

Я использую System.Collections.Generic.Dictionary. Это для .NET 2.0. 

25
Helephant

Нет ничего плохого в цикле for/foreach. Это все гипотетический метод AddRange.

Единственное, что меня беспокоит, - это поведение выделения памяти, поскольку добавление большого количества записей может привести к множественным перераспределениям и повторным хэшированию. Нет возможности увеличить емкость существующего словаря на определенную величину. Возможно, было бы лучше выделить новый словарь с достаточной емкостью для обоих текущих, но вам все равно нужен цикл для загрузки хотя бы одного из них.

16
Mike Dimmick

Есть конструктор Dictionary, который принимает другой Dictionary.

Вам придется привести его IDictionary, но есть перегрузка Add(), которая принимает KeyValuePair<TKey, TValue>. Вы все еще используете foreach.

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

можно передать существующий словарь животных конструктору.

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

Ради интереса я создал этот метод расширения для словаря. Это должно сделать глубокую копию, где это возможно.

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

Если вы имеете дело с двумя существующими объектами, вы можете получить некоторое преимущество с помощью метода CopyTo: http://msdn.Microsoft.com/en-us/library/cc645053.aspx

Используйте метод Add другой коллекции (получателя), чтобы поглотить их.

0
Oli

Я не понимаю, почему бы не использовать словарь (словарь) (как предложено ageektrapped). 

Вы хотите выполнить поверхностную или глубокую копию? (то есть оба словаря указывают на одинаковые ссылки или новые копии каждого объекта в новом словаре?)

Если вы хотите создать словарь new, указывающий на объекты new, я думаю, что единственный путь - через foreach .

0
Martin Marconcini