2016-09-20 5 views
0

ich eine Liste der Wörterbücher hat, wie:C# erstellen Wörterbuch von Liste <Dictionary>

dic1.Add("A_key1","A_val11"); dic1.Add("B_key1","B_val11") 
dic1.Add("C","C"); dic1.Add("D","D"); 

dic2.Add("A_key1","A_val21"); dic1.Add("B_key1","B_val21"); 
dic2.Add("C","C"); dic1.Add("D","D"); 
dic2.Add("A_key2","A_val22"); dic1.Add("B_key2","B_val22"); 
dic2.Add("A_key3","A_val23"); dic1.Add("B_key3","B_val23"); 

List<Dictionary<string,string>> tempList = new List<Dictionary<string,string>>{dic1, dic2}; 

Ich brauche Regel ein Wörterbuch von tempList folgen zu erstellen: key = "A_Key *" Wert, val = „B_key * "Wert von allen ursprünglichen Wörterbüchern in Liste. zB im obigen Beispiel:

expectDic = {("A_val11","B_val11"), 
       ("A_val21","A_val21"), 
       ("A_val22","A_val22"), 
       ("A_val23","A_val23")} 

Kann ich es mit Linq lösen?

+1

Eine Kombination von 'SelectMany' und' ToDictionary' könnte den Trick machen –

+0

Wird es jemals nur 2 Wörterbücher geben? und was ist mit Artikeln, die in beiden Wörterbüchern keine übereinstimmenden Schlüssel haben? – sachin

+0

Was ist 'dic2'? – Maarten

Antwort

0

Ihre Frage ist unklar, also werde ich ein paar Annahmen machen. Wenn diese Annahmen nicht korrekt sind, lassen Sie es mich wissen und ändern Sie sie gegebenenfalls.

Geht man von den Testdaten weg, weil die Schlüssel identisch sind, wird das Zusammenführen der Wörterbücher nicht möglich sein, daher die Liste.

Schließlich sind Ihre Testdaten in sich falsch, da es eine Ausnahme auslöst. So habe ich die Annahme, dass die Testdaten die folgende war:

 Dictionary<string, string> dic1 = new Dictionary<string, string>(); 
     Dictionary<string, string> dic2 = new Dictionary<string, string>(); 

     dic1.Add("A_1", "A_val11"); 
     dic1.Add("B_1", "B_val11"); 
     dic1.Add("C", "C"); 
     dic1.Add("D", "D"); 


     dic2.Add("A_1", "A_val21"); 
     dic2.Add("A_2", "A_val22"); 
     dic2.Add("A_3", "A_val23"); 
     dic2.Add("B_1", "B_val21"); 
     dic2.Add("B_2", "B_val22"); 
     dic2.Add("B_3", "B_val23"); 
     dic2.Add("C", "C"); 
     dic2.Add("D", "D"); 


     List<Dictionary<string, string>> tempList = new List<Dictionary<string, string>> { dic1, dic2 }; 

Hier ist ein Code, der für das gegebene Beispiel funktioniert:

Dictionary<string, string> expectDic = new Dictionary<string, string>(); 
     for (int i = 0; i < tempList.Count; i++) 
     { 
      Dictionary<string, string> onedic = tempList[i]; 
      while (onedic.Values.ToList().Where(x => x.Contains("A_")).FirstOrDefault() != null) 
      { 
       expectDic.Add(onedic.Select(x => x.Value).Where(x => x.Contains("A_") && !expectDic.Keys.Contains(x)).First(), onedic.Select(x => x.Value).Where(x => x.Contains("B_") && !expectDic.Values.Contains(x)).First()); 
       onedic.Remove(onedic.Select(x => x.Key).Where(x => x.Contains("A_")).FirstOrDefault()); 
       onedic.Remove(onedic.Select(x => x.Key).Where(x => x.Contains("B_")).FirstOrDefault()); 
      } 
     } 

Doch was Sie fordern ist sehr kompliziert und ich würde die Ausnahmebehandlung für den LINQ empfehlen.

Verwandte Themen