2010-04-19 5 views
2

Y a-t-il un moyen en C# de fusionner deux dictionnaires? J'ai deux dictionnaires qui peuvent avoir les mêmes clés, mais je cherche un moyen de les fusionner, donc à la fin il y a un dictionnaire avec une clé et les valeurs des deux dictionnaires fusionnés. J'ai trouvé le code suivant, mais il ne gère pas les doublons.Comment fusionner deux dictionnaires en C# avec des doublons

Dictionary Mydictionary<string, string[]> = new Dictionary<string, string[]>(); 
Mydictonary.Union(secondDictionary).ToDictionary(pair => pair.Key, pair => pair.Value); 
+0

Pourriez-vous définir ce que vous entendez par "fusionné" dans le contexte d'une seule clé avec plusieurs valeurs fusionnées? –

+0

Salut Jeffrey, Par exemple, Mon premier dictionnaire est { "Une touche" => "Valeur 1", valeur 2 "} Mon second dictionnaire est {" Une touche »=> "Valeur 3"} Le fusionné Le dictionnaire que je cherche est {"Key One" => "Value1", "Value2", "Value3"} – user320587

Répondre

2

Si vous voulez une approche LINQ, essayez ceci:

Dictionary<string, string[]> firstDic = new Dictionary<string, string[]> 
{ 
    {"apple", new [] {"red"}}, 
    {"orange", new [] {"orange"}} 
}; 

Dictionary<string, string[]> secondDic = new Dictionary<string, string[]> 
{ 
    {"apple", new [] {"green"}}, 
    {"banana", new [] {"yellow"}} 
}; 

Dictionary<string, string[]> resultDic = firstDic.Union(secondDic) 
    .GroupBy(o => o.Key) 
    .ToDictionary(o => o.Key, o => o.SelectMany(kvp => kvp.Value).ToArray()); 

Pour les échantillons, vous obtiendrez un dictionnaire avec 3 KeyValuePairs et l'élément avec une clé de « pomme » aura un tableau avec "rouge" et "vert" pour la valeur.

+0

Merci à tous .. – user320587

+0

+1 J'aime vos exemples. pour 'KeyValuePair ' n'est pas basé sur 'TKey', je ne m'attendais pas à ce que le' firstDic.Union (secondDic) 'conserve des dups.Intéressant –

+0

Essayez: https://stackoverflow.com/a/10685205/426422 (en utilisant l'intersection) –

0

Cela devrait le faire:

Dictionary<string, string[]> dict1 = new Dictionary<string, string[]>(); 
Dictionary<string, string[]> dict2 = new Dictionary<string, string[]>(); 

Dictionary<string, List<string>> combined = new Dictionary<string, List<string>>(); 

foreach (var pair in dict1) combined.Add(pair.Key, new List<string>(pair.Value)); 
foreach (var pair in dict2) 
{ 
    List<string> list; 

    if (!combined.TryGetValue(pair.Key, out list)) combined.Add(pair.Key, list = new List<string>()); 

    list.AddRange(pair.Value); 
} 

Si vous vraiment veulent le résultat en tant que Dictionary<string, string[]>, vous pouvez virer de bord ce message à la fin:

Dictionary<string, string[]> combinedArray = new Dictionary<string, string[]>(); 

foreach (var pair in combined) combinedArray.Add(pair.Key, pair.Value.ToArray()); 
1

Peut-être quelque chose comme ceci:

foreach (var value in secondDictionary) 
    if (myDictionary.Contains(value.Key)) 
     myDictionary[value.Key] = myDictionary[value.Key] 
            .Concat(value.Value).ToArray(); 
    else 
     myDictionary[value.Key] = value.Value; 
Questions connexes