Quel est le moyen le plus rapide de copier les valeurs et les clés d'un dictionnaire dans un autre en C #?

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

  •  09-06-2019
  •  | 
  •  

Question

Il ne semble pas y avoir de méthode dictionary.AddRange (). Est-ce que quelqu'un connaît un meilleur moyen de copier les éléments dans un autre dictionnaire sans utiliser une boucle foreach.

J'utilise System.Collections.Generic.Dictionary. Ceci est pour .NET 2.0.

Était-ce utile?

La solution

Il n’ya rien de mal avec une boucle for / foreach. C'est tout ce qu'une méthode hypothétique AddRange ferait de toute façon.

La seule préoccupation supplémentaire que j’aurais à faire concerne le comportement d’allocation de mémoire, car l’ajout d’un grand nombre d’entrées pourrait entraîner de multiples réaffectations et hachages. Il n'y a aucun moyen d'augmenter la capacité d'un dictionnaire existant d'un montant donné. Vous feriez peut-être mieux d’allouer un nouveau dictionnaire d’une capacité suffisante pour les deux versions actuelles, mais vous aurez tout de même besoin d’une boucle pour en charger au moins un.

Autres conseils

Il y a le constructeur Dictionary qui prend un autre IDictionary.

Vous devrez le lancer Add(), mais il existe une KeyValuePair<TKey, TValue> surcharge qui prend <=>. Vous utilisez toujours foreach, cependant.

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

on peut passer un dictionnaire d’animaux existant au constructeur.

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

Pour le plaisir, j’ai créé cette méthode d’extension au dictionnaire. Cela devrait faire une copie en profondeur chaque fois que possible.

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 vous utilisez deux objets existants, la méthode CopyTo vous permettra peut-être de gagner du temps: http://msdn.microsoft.com/en-us/library/cc645053.aspx

Utilisez la méthode Add de l'autre collection (récepteur) pour les absorber.

Je ne comprends pas, pourquoi ne pas utiliser le dictionnaire (dictionnaire) (comme suggéré par ageektrapped).

Voulez-vous effectuer une copie superficielle ou une copie profonde? (c’est-à-dire que les deux dictionnaires pointant sur les mêmes références ou de nouvelles copies de chaque objet du nouveau dictionnaire?)

Si vous souhaitez créer un nouveau dictionnaire pointant sur de nouveaux objets, je pense que la seule solution consiste à utiliser un foreach .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top