Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 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

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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