Combiner les deux Dictionnaires avec LINQ
Ma question a été identifiée comme un double de cette question: Comment combiner deux dictionnaires sans boucle?
Je crois que ma question est différent parce que je me demande comment combiner deux dictionnaires en particulier: je veux tous les éléments de Dictionary1 plus tous les éléments de Dictionary2 qui ne sont pas (c'est à dire la clé n'existe pas) dans Dictionary1.
J'ai deux dictionnaires comme ceci:
var d1 = new Dictionary<string,object>();
var d2 = new Dictionary<string,object>();
d1["a"] = 1;
d1["b"] = 2;
d1["c"] = 3;
d2["a"] = 11;
d2["e"] = 12;
d2["c"] = 13;
Je tiens à les combiner dans un nouveau Dictionnaire (techniquement, il n'a pas à être un dictionnaire, il pourrait juste être une séquence de KeyValuePairs
) de telle sorte que la sortie contient tous les KeyValuePairs
de d1 et seul le KeyValuePairs de d2
dont la Clé n'apparaît pas dans d1
.
Sur le plan conceptuel:
var d3 = d1.Concat(d2.Except(d1))
Mais qui me donne tous les éléments de d1 et d2.
Semble comme il devrait être évident, mais quelque chose doit m'échapper.
- Double Possible de Comment ajouter 2 contenu du Dictionnaire sans boucle en c#
- Cette question n'est pas un doublon de cette question. Cette question est de se demander comment combiner les deux dictionnaires, d1 et d2, tels que le dictionnaire de tous les éléments de la d1, en plus de tous les éléments de d2 qui ne sont pas déjà en d1. L'autre question est de poser des questions, et les réponses expliquer comment, à combiner les deux dictionnaires, sans conditions supplémentaires.
Vous devez vous connecter pour publier un commentaire.
Lorsque vous utilisez
Except
par défaut, il utilise la valeur par défaut comparateur d'égalité, qui, pour laKeyValuePair
type compare les clés et les valeurs. Vous pourriez cette approche au lieu:C'est de travailler pour moi.
Jon Skeet (comme d'habitude) est une méthode d'extension vous permettant de faire ceci: Puis-je définir mon type explicite comparateur inline?
Eh bien, je ne sais pas si c'est une nouvelle fonctionnalité dans LinQ, mais c'est exactement ce que
.Union()
n' :De cours à l'aide de Dictionnaires, vous devrez donner une coutume comparateur d'égalité pour correspondre uniquement les touches :
et puis :
Avec votre exemple, la sortie serait (testé en C# interactive) :
Notez la différence :
Vous pouvez également utiliser votre propre
IEqualityComparer
. L'exemple ci-dessous:IEqualityComparer
pourrait être mieux, surtout si elles sont appliquées comme une méthode d'extension.Une autre solution à l'aide de votre propre
IEqualityComparer
comme dans la réponse de @bitxwise et @DaveShaw, mais de ne pas utiliserExcept()
ce qui le rend un peu plus simple: