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

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

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Я использую эту Систему.Коллекции.Общий словарь.Это для .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);

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top