Qual é a maneira mais rápida de copiar os valores e chaves de um dicionário para outro em C#?
-
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.
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<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 .