web-dev-qa-db-fra.com

Comment combiner deux dictionnaires sans boucle?

J'ai deux dictionnaires de type <string,object> en C #. Comment puis-je copier tout le contenu d'un objet Dictionary dans l'autre sans appliquer de boucle?

45
Pradeep
var d3 = d1.Concat(d2).ToDictionary(x => x.Key, x => x.Value);
90

Vous pouvez utiliser Concat :

Dictionary<string, object> d1 = new Dictionary<string, object>();
d1.Add("a", new object());
d1.Add("b", new object());
Dictionary<string, object> d2 = new Dictionary<string, object>();
d2.Add("c", new object());
d2.Add("d", new object());

Dictionary<string, object> d3 = d1.Concat(d2).ToDictionary(e => e.Key, e => e.Value);

foreach (var item in d3)
{
    Console.WriteLine(item.Key);
}
42
bruno conde

Tout d'abord, ce n'est pas possible sans boucle. Que cette boucle soit effectuée dans une méthode (d'extension) est sans importance, elle nécessite toujours une boucle.

Je vais en fait recommander de le faire manuellement. Toutes les autres réponses données nécessitent l'utilisation de deux méthodes d'extension (Concat - ToDictionary et SelectMany - ToDictionary) et donc une boucle deux fois. Si vous faites cela pour optimiser votre code, il sera plus rapide de faire une boucle sur le dictionnaire B et d'ajouter son contenu au dictionnaire A.

Edit: Après une enquête plus approfondie, l'opération Concat ne se produirait que pendant l'appel ToDictionary, mais je pense toujours qu'une méthode d'extension personnalisée serait plus efficace.

Si vous souhaitez réduire la taille de votre code, créez simplement une méthode d'extension:

public static class DictionaryExtensions
{
    public static IDictionary<TKey,TVal> Merge<TKey,TVal>(this IDictionary<TKey,TVal> dictA, IDictionary<TKey,TVal> dictB)
    {
        IDictionary<TKey,TVal> output = new Dictionary<TKey,TVal>(dictA);

        foreach (KeyValuePair<TKey,TVal> pair in dictB)
        {
            // TODO: Check for collisions?
            output.Add(pair.Key, Pair.Value);
        }

        return output;
    }
}

Ensuite, vous pouvez l'utiliser en important ('en utilisant') l'espace de noms DictionaryExtensions et en écrivant:

IDictionary<string,objet> output = dictA.Merge(dictB);

J'ai fait agir la méthode comme si les objets sont immuables, mais vous pouvez facilement la modifier pour ne pas retourner un nouveau dictionnaire et simplement fusionner dans dictA.

9
Richard Szalay
var result = dictionaries.SelectMany(dict => dict)
             .ToDictionary(pair => pair.Key, pair => pair.Value);
5