11
votes

Comment résumer vos valeurs de deux dictionnaires en C #?

J'ai deux dictionnaires avec la même structure: xxx pré>

J'aimerais résumer les valeurs des dictionnaires et renvoyer une troisième dictionnaire avec les clés et les valeurs totales de chaque Touche: P>

Table, 9
Chair, 10
Couch, 9


2 commentaires

Est-il garanti que les deux dictionnaires auront le même ensemble de clés?


@Carlos Dans ce cas, oui. Mais il serait intéressant de voir une solution où les dictionnaires partagent des clés et non d'autres.


6 Réponses :


15
votes

Ce qui suit n'est pas la solution la plus efficace (car elle traite simplement les deux dictionnaires comme énumérables), mais cela fonctionnera et il est assez clair:

Dictionary<string, int> result = (from e in foo.Concat(bar)
              group e by e.Key into g
              select new { Name = g.Key, Count = g.Sum(kvp => kvp.Value) })
              .ToDictionary(item => item.Name, item => item.Count);


1 commentaires

Edité votre réponse pour montrer comment récupérer la requête résultante dans un dictionnaire.



4
votes
(from a in foo
let b = bar.ContainsKey(a.Key) ? (int?)bar[a.Key] : null
select new { Key = a.Key, Value = a.Value + (b != null ? b : 0) }
).ToDictionary(a => a.Key, a => a.Value)

1 commentaires

Merci d'avoir répondu; Cette réponse aide également si vous souhaitez calculer des deltas entre les objets.



5
votes

Si vous avez une garantie de fonte Garantie que les deux ensembles de clés sont les mêmes: xxx

meilleur que je puisse trouver si les clés ne sont pas identiques: < Pré> xxx


0 commentaires

3
votes

mmm, je ne sais pas qui est plus par formant, mais comment votre solution n'est pas lisible?

Qu'est-ce qui ne va pas avec p>

   foreach (string key in d1.Keys)
      {
         if(d2.ContainsKey(key)
            d3.Add(key,d1[key]+d2[key]);
         else
            d3.Add(key,d1[key])
      }

   foreach (string key in d2.keys)
       {
          if(!d1.ContainsKey(key) // only get keys that are unique to d2
             d3.Add(key,d2[key]);
       }


2 commentaires

Eh bien, il reste toujours la question de d2 avoir des clés qui ne sont pas dans d1 , bien sûr ...


@Dan Tao Ouais, cela ne fonctionnerait que pour les clés partagées. EDIT: D'accord, j'ai ajouté la solution pour cela: p



2
votes

Qu'en est-il de quelque chose comme ça? xxx

au moins c'est (genre de?) Neat.


0 commentaires

2
votes

J'ai écrit une petite méthode d'extension qui fusionnera une liste de dictionnaires avec des valeurs INT. J'ai utilisé le code de cette question pour le faire pour que je partage xxx


0 commentaires