Qual è il modo più veloce per copiare i valori e le chiavi da un dizionario in un altro in C#?

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

  •  09-06-2019
  •  | 
  •  

Domanda

Non sembra essere un dizionario.Iladdrangemetodo() metodo.Qualcuno conosce un modo migliore per copiare gli elementi di un altro dizionario, senza l'utilizzo di un ciclo foreach.

Sto utilizzando il Sistema.Collezioni.Generico.Dizionario.Questo è per .NET 2.0.

È stato utile?

Soluzione

Non c'è niente di sbagliato con un per/ciclo foreach.Che è tutto un ipotetico Iladdrangemetodo, comunque.

L'unico extra preoccupazione mi piacerebbe avere è di allocazione della memoria comportamento, in quanto l'aggiunta di un gran numero di voci che potrebbe causare più di riallocazione e re-hash.Non c'è modo di aumentare la capacità di un Dizionario esistente da parte di un determinato importo.Si potrebbe essere meglio l'allocazione di un nuovo Dizionario, con sufficiente capacità sia per quelli attuali, ma si sarebbe ancora bisogno di un ciclo di carico di almeno uno di loro.

Altri suggerimenti

C'è il Dictionary costruttore che prende un altro Dictionary.

Dovrete cast IDictionary, ma c'è un Add() overload che accetta KeyValuePair<TKey, TValue>.Si sta ancora utilizzando un ciclo foreach, però.

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

uno può passare animale esistente, in Dizionario il costruttore.

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

Per divertimento, ho creato questo metodo di estensione per il dizionario.Questo dovrebbe fare una copia profonda, ove possibile.

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 hai a che fare con due oggetti esistenti, si potrebbe ottenere qualche chilometraggio con il metodo CopyTo: http://msdn.microsoft.com/en-us/library/cc645053.aspx

Utilizzare il metodo Add dell'altra raccolta (ricevitore) per assorbire.

Non capisco, perché non usare il Dizionario( Dizionario ) (come suggerito da ageektrapped ).

Si desidera eseguire una Copia Superficiale o Profonda Copia?(entrambi i Dizionari indicando gli stessi riferimenti o nuove copie di ogni oggetto all'interno del nuovo dizionario?)

Se si desidera creare un nuovo Dizionario di puntamento per nuovo oggetti, penso che l'unico modo è attraverso un foreach.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top