it-swarm-pt.tech

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

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

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

27
Helephant

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

A única preocupação extra que eu tenho é com o comportamento de alocação de memória, porque adicionar um grande número de entradas pode causar várias realocações e re-hashes. Não há como aumentar a capacidade de um dicionário existente em um determinado valor. É melhor alocar um novo dicionário com capacidade suficiente para os dois atuais, mas ainda é necessário um loop para carregar pelo menos um deles.

17
Mike Dimmick

Existe o construtor Dictionary que leva outro Dictionary.

Você precisará convertê-lo IDictionary, mas há uma sobrecarga de Add() que requer KeyValuePair<TKey, TValue>. Você ainda está usando o foreach, no entanto.

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

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

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

Por diversão, criei esse método de extensão para o 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;
        }
3
BFree

Se você estiver lidando com dois objetos existentes, poderá 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.

0
Oli

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

Deseja executar uma cópia rasa ou uma cópia profunda? (ou seja, ambos os Dicionários apontando para as mesmas referências ou novas cópias de todos os objetos dentro do novo dicionário?)

Se você deseja criar um novo Dicionário apontando para novos objetos, I pense que o único caminho é através de um foreach.

0
Martin Marconcini