2 votes

Linq : Fusionner les dictionnaires

J'ai deux dictionnaires en C#.

Les deux dictionnaires et leurs calues sont

 Dictionary<int,List<string>> D1 = new Dictionary<int,List<string>>(); 
 Dictionary<int,List<string>> D2= new Dictionary<int,List<string>>(); 
 Dictionary<int,List<string>> D3 new Dictionary<int,List<string>>();
 D1[1] = new List<string>{"a","b"};
 D1[2] = new List<string>{"c","d"}; 
 D1[3] = new List<string>{"e","f"}; 
 D1[4] = new List<string>{"h"};  

Où 1, 2, 3 et 4 sont les clés du dictionnaire D1.

 D2[1] = new List<string>{"a","b"}; 
 D2[2] = new List<string>{"c","d"}; 
 D2[3] = new List<string>{"e","f"};
 D2[4] = new List<string>{"g"}; 
 D2[5] = new List<string>{"b","h"};
 D2[6] = new List<string>{"f","l"};
 D2[7] = new List<string>{"z"}; 

Où 1, 2, 3, 4, 5, 6 et 7 sont les clés du dictionnaire D2.

Alors le dictionnaire de sortie contient ces valeurs,

 D3[1] = {"a","b","h"}   D3[2] = {"c","d"}   D3[3] = {"e","f","l"} 

Note : Veuillez prendre le dictionnaire d'entrée avec des valeurs supérieures à 1. C'est pourquoi j'élimine les D1[4] , D2[4] et D2[7].

EST-IL POSSIBLE DE LE FUSIONNER EN UTILISANT LINQ ?

1voto

Doctor Jones Points 11502

Oui, c'est possible, mais ce n'est pas joli !

//firstly lets get the keys that are valid (i.e. have more than one element in their list)
var validD1Elements = D1.Where(d => d.Value.Count > 1);
var validD2Elements = D2.Where(d => d.Value.Count > 1);

//merge the valid keys together so we know which ones we want to select
var mergedKeys = validD1Elements.Select(d => d.Key).Union(validD2Elements.Select(d => d.Key));

//perform the merge
var mergeResult = mergedKeys.Select (key => new
{
    Key = key,
    //select the values from D1
    Value = validD1Elements.Where(d => d.Key == key).SelectMany(d => d.Value)
    //concat the values from D2
    .Concat(validD2Elements.Where(d => d.Key == key).SelectMany(d => d.Value))
}).ToDictionary(e => e.Key, e => e.Value);

Cette fusion utilise Concat donc vous obtiendrez des doublons, c'est-à-dire mergeResult[1] sera { "a", "b", "a", "b" } .

Si vous ne voulez pas de doublons, changez le code suivant de celui-ci :

//concat the values from D2
.Concat(validD2Elements.Where(d => d.Key == key).SelectMany(d => d.Value))

à ça :

//union the values from D2
.Union(validD2Elements.Where(d => d.Key == key).SelectMany(d => d.Value))

mergeResult[1] sera alors { "a", "b" } .

0voto

leppie Points 67289

Les concaténer tous, puis les regrouper par (ToLookup) la clé, puis réunir toutes les valeurs dans un regroupement, enfin les remettre dans un dictionnaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X