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

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

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

Ответы [ 6 ]

21 голосов
/ 17 сентября 2008

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

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

17 голосов
/ 17 сентября 2008

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

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

9 голосов
/ 09 августа 2017
var Animal = new Dictionary<string, string>();

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

Dictionary<string, string> NewAnimals = new Dictionary<string, string>(Animal);
3 голосов
/ 17 сентября 2008

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

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;
        }
0 голосов
/ 17 сентября 2008

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

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

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

0 голосов
/ 17 сентября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...