2010-07-13 7 views
2

je dois comparer deux dictionnaires et de mettre à jour un autre dictionnaire avec des éléments inégalésComparaison Dictionnaires en utilisant LINQ en C#

Les deux dictionnaires sont comme

Dictionary<String, List<String>> DICTONE = new Dictionary<string, List<String>>(); 
Dictionary<string, List<String>> DICTTWO = new Dictionary<string, List<String>>(); 

Et le contenu

DICTONE["KEY1"]="A" 
       "B" 
       "C" 

DICTONE["KEY2"]="D" 
       "E" 
       "F" 

DICTTWO["KEY1"]="A" 
       "B" 
       "Z" 

DICTTWO["KEY3"]="W" 
       "X" 
       "Y" 

Le troisième dictionnaire a une instance de classe en tant que valeur

Dictionary<String, MyClass> DICTRESULT = new Dictionary<string, MyClass>(); 

et la classe est comme

class MyClass 
{ 
    public List<string> Additional = null; 
     public List<string> Missing = null; 

    public MyClass() 
     { 
      Additional = new List<string>(); 
      Missing = new List<string>(); 
     } 
     public MyClass(List<string> p_Additional, List<string> p_Missing) 
     { 
      Additional = p_Additional; 
      Missing = p_Missing; 
     } 
} 

Le scenerio est

  1. Si un élément dans DICTONE et non pas dans DICTTWO l'ajouter l'élément à la liste MISSING dans le RESULTDICT
  2. Si un élément dans DICTTWO et PAS dans DICTTONE ajouter l'élément à la liste SUPPLÉMENTAIRE dans le RESULTDICT

la réponse attendue est

DICTRESULT["KEY1"]=ADDITIONAL LIST ---> "Z" 
        MISSING LIST ---> "C" 

DICTRESULT["KEY2"]=ADDITIONAL LIST ---> "" 
        MISSING LIST ---> "D" 
             "E" 
             "F" 
DICTRESULT["KEY3"]=ADDITIONAL LIST ---> "" 
        MISSING LIST ---> "W" 
             "X" 
             "Y" 

est-il possible de le faire en utilisant LINQ

+0

On dirait que les devoirs, pourriez-vous montrer ce que vous avez déjà fait? –

+0

Pas grand chose, il a déjà posé une question très similaire http://stackoverflow.com/questions/3226123/how-to-compare-two-xml-files-in-c-using-xml-to-linq –

Répondre

2

Eh bien, voici une tentative, en supposant first et second sont les dictionnaires en question.

var items = from key in first.Keys.Concat(second.Keys).Distinct() 
      let firstList = first.GetValueOrDefault(key) ?? new List<string>() 
      let secondList = second.GetValueOrDefault(key) ?? new List<string>() 
      select new { Key = key, 
         Additional = secondList.Except(firstList), 
         Missing = firstList.Except(secondList) }; 
var result = items.ToDictionary(x => x.Key, 
           x => new MyClass(x.Additional, x.Missing)); 

Ceci est complètement non testé, pensez-y. Je n'ai même pas essayé de le compiler. Il nécessite également une méthode d'extension supplémentaire:

public static TValue GetValueOrDefault<TKey, TValue> 
    (this IDictionary<TKey, TValue> dictionary, 
    TKey key) 
{ 
    TValue value; 
    dictionary.TryGetValue(key, out value) 
    return value; 
}