Qual é a maneira mais rápida de copiar os valores e chaves de um dicionário para outro em C#?

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

  •  09-06-2019
  •  | 
  •  

Pergunta

Não parece haver um método Dictionary.AddRange().Alguém conhece uma maneira melhor de copiar os itens para outro dicionário sem usar um loop foreach.

Estou usando o System.Collections.Generic.Dictionary.Isto é para .NET 2.0.

Foi útil?

Solução

Não há nada de errado com um loop for / foreach. Isso é tudo um método AddRange hipotético faria de qualquer maneira.

A preocupação único extra que eu tenho é com o comportamento de alocação de memória, porque a adição de um grande número de entradas pode causar várias realocações e re-hashes. Não há nenhuma maneira de aumentar a capacidade de um dicionário existente por um determinado montante. Você pode ser melhor alocação de um novo dicionário com capacidade suficiente para ambos os atuais, mas você ainda precisa de um loop para carga, pelo menos um deles.

Outras dicas

Há o construtor Dictionary que leva outra Dictionary.

Você terá que lançá-lo IDictionary, mas há uma sobrecarga Add() que leva KeyValuePair<TKey, TValue>. Você ainda está usando foreach, no entanto.

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

pode-se passar animais dicionário existente para o construtor.

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

Para se divertir, eu criei este método de extensão ao dicionário. Isso deve fazer uma cópia profunda sempre que possível.

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

Se você está lidando com dois objetos existentes, você pode obter alguma milhagem com o método CopyTo: http://msdn.microsoft.com/en-us/library/cc645053.aspx

Use o método Add da outra coleção (receptor) para absorvê-los.

Eu não entendo, por que não usar o Dictionary (Dicionário) (como sugerido por ageektrapped).

Você quer executar uma rasa Copiar ou uma cópia profunda? (Isto é, ambos os dicionários que apontam para as mesmas referências ou novas cópias de cada objeto dentro do novo dicionário?)

Se você quiser criar um new dicionário apontando para new objetos, eu acho que a única maneira é através de um foreach .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top