2010-12-31 10 views
2

Ich habe zwei Wörterbücher in C#.Linq: Mischen Sie die Wörterbücher

Die zwei Wörterbücher und ihre calues ​​sind

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

Wo 1,2,3 und 4 Tasten Wörterbuch D1 sind

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

Wo 1,2,3,4,5,6 und 7 Tasten Wörterbuch D2

Dann ist der Ausgang Wörterbuch diese Werte enthält,

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

Hinweis: Um die Eingabe Wörterbuch Bitte nehmen Sie mit Werten größer als 1.Thats, warum ich die D1 bin beseitigen [4], D2 [4] und D2 [7]

IST ES MÖGLICH verflechten LINQ weiter verwenden?

+0

Wenn ich Ihre Frage genau verstanden habe, dann sollte die Menge in D1 [1] und die Menge in D2 [1] deutlich zusammenführen, um D3 [1] zu erhalten. In dem von Ihnen angegebenen Beispiel sollte die D3 [1] eine Menge {"a", "b"} und nicht {"a", "b", "h"} ergeben. Wenn das stimmt, lass es mich wissen, damit ich dir die Lösung geben kann. Aktualisieren Sie Ihre Frage entsprechend, damit Ihre Frage für andere nicht verwirrend ist. – samar

+0

Genaues Duplizieren (bis auf die Variablennamen!): Http://stackoverflow.com/questions/3156456/merging-dictonaries-in-c-using-linq. Wer auch immer diese Hausaufgaben macht, weiß, dass Sie StackOverflow darum bitten Du? – AakashM

Antwort

1

Ja, es ist möglich, aber es ist nicht schön!

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

Diese merge verwendet Concat, so dass Sie Duplikate erhalten wird, wird das heißt mergeResult[1]{ "a", "b", "a", "b" } sein.

Wenn Sie nicht möchten, dass Duplikate ändern Sie den folgenden Code aus dieser:

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

dazu:

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

mergeResult[1] dann { "a", "b" } sein wird.

0

Verbinden Sie sie alle, dann gruppieren Sie nach (ToLookup) den Schlüssel, dann Vereinigungsmenge alle Werte in einer Gruppierung, schließlich schieben sie alle zurück in ein Wörterbuch.

Verwandte Themen