2010-07-13 2 views
2

мне нужно сравнить два словаря и обновить другой словарь с несогласованными пунктамиСравнение Словари с помощью LINQ в C#

Два словари подобны

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

И содержанием

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

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

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

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

третий словарь имеет экземпляр класса как значение

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

и класс, как

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; 
     } 
} 

scenerio является

  1. Если элемент в DICTONE и НЕ в DICTTWO оного элемента в ОТСУТСТВУЕТ список в RESULTDICT
  2. Если элемент в DICTTWO и NOT в DICTTONE добавьте товар в ДОПОЛНИТЕЛЬНЫЙ список в RESULTDICT

ожидаемый ответ

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" 

есть ли способ сделать это с помощью LINQ

+0

Похоже, домашнее задание, вы могли бы показать, что уже сделали? –

+0

Не много, он уже задал очень похожий вопрос http://stackoverflow.com/questions/3226123/how-to-compare-two-xml-files-in-c-using-xml-to-linq –

ответ

2

Ну, вот попытка, предполагая first и second являются словари вопрос.

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)); 

Это совершенно непроверено, заметьте. Я даже не пытался его скомпилировать. Для этого также необходим дополнительный способ продления:

Смежные вопросы