¿Cuál es la forma más rápida de copiar los valores y claves de un diccionario a otro en C#?

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

  •  09-06-2019
  •  | 
  •  

Pregunta

No parece haber un método diccionario.AddRange().¿Alguien conoce una mejor manera de copiar los elementos a otro diccionario sin utilizar un bucle foreach?

Estoy usando System.Collections.Generic.Dictionary.Esto es para .NET 2.0.

¿Fue útil?

Solución

No hay nada de malo en un bucle for/foreach.Eso es todo lo que haría un método hipotético AddRange de todos modos.

La única preocupación adicional que tendría es con el comportamiento de asignación de memoria, porque agregar una gran cantidad de entradas podría causar múltiples reasignaciones y repeticiones.No hay forma de aumentar la capacidad de un Diccionario existente en una cantidad determinada.Quizás sería mejor asignar un nuevo diccionario con capacidad suficiente para los dos actuales, pero aún necesitaría un bucle para cargar al menos uno de ellos.

Otros consejos

Ahí está el Dictionary constructor que toma otro Dictionary.

tendrás que lanzarlo IDictionary, pero hay un Add() sobrecarga que lleva KeyValuePair<TKey, TValue>.Sin embargo, todavía estás usando foreach.

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

se puede pasar el diccionario de animales existente al constructor.

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

Por diversión, creé este método de extensión al diccionario.Esto debería hacer una copia profunda siempre que sea posible.

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

Si está trabajando con dos objetos existentes, es posible que obtenga algo de provecho con el método CopyTo: http://msdn.microsoft.com/en-us/library/cc645053.aspx

Utilice el método Agregar de la otra colección (receptor) para absorberlos.

No entiendo, ¿por qué no usar el Diccionario (Diccionario) (como lo sugiere ageektrapped)?

¿Quieres realizar una copia superficial o una copia profunda?(es decir, ¿ambos diccionarios apuntan a las mismas referencias o nuevas copias de cada objeto dentro del nuevo diccionario?)

Si quieres crear un nuevo Diccionario que apunta a nuevo objetos, creo que la única manera es a través de un para cada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top