2015-06-04 3 views
1

у меня есть два словаря А и Б.сравнить два словаря по ключу для получения значений совпадающих ключей

A - (a,b) (c,d) (e,f) 
B - (a,p) (c,q) (g,h) 

Я хочу, чтобы иметь возможность сделать новый словарь C, который будет ниже -

C - (b,p) (d,q) 

Есть ли способ, которым я могу это сделать?

Это то, что я в настоящее время:

var C= B.Where(d => A.ContainsKey(d.Key)).ToList(); 
+0

Опубликовать код, чтобы мы могли вам помочь. –

+0

foreach (var kvp in A) {if (B.ContainsKey (kvp.Key)) {C.Add (kvp.Value, B [kvp.Key] .Value); }} – mclaassen

+0

var C = B.Where (d => A.ContainsKey (d.Key)). ToList(); –

ответ

4

Easy с Linq;)

var query = 
    from x in dictionary1 
    join y in dictionary2 on x.Key equals y.Key 
    select new { Value1 = x.Value, Value2 = y.Value }; 

var newDict = query.ToDictionary(item => item.Value1, item => item.Value2); 

Однако это не самый эффективный подход, так как он не использует быстрого поиска словаря в , Более быстрый подход будет примерно таким:

var newDict = new Dictionary<string, string>(); // adjust the key and value types as needed 
foreach (var kvp in dictionary1) 
{ 
    string value2; 
    if (dictionary2.TryGetValue(kvp.Key, out value2)) 
    { 
     newDict.Add(kvp.Value, value2); 
    } 
} 
+0

Отлично! Это работает. Спасибо –

+0

@SaurabhSahasrabuddhe, я обновил свой ответ, чтобы предложить более эффективный подход. –

+2

'join' использует хэш-таблицу внутри, поэтому поиск также должен быть быстрым. – Magnus

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