2010-07-15 50 views
1

加入了另一种价值观我有字典LINQ。更新一个字典从相应的键

dic1<double, double> 
dic2<double, double> 

长度可能会不匹配。所以我需要从dic2更新dic1中的值,通过dic1.key == dic2.key加入...但是保留那些在dic2中没有对应键的dic1中的值。

.NET 3.5

回答

1

这里有一个LINQ左外连接的版本:如果DIC2包含的元素不DIC1,那么您将添加新的元素

Dictionary<double, double> dictionary = 
(from d1 in dic1 
join d2 in dic2 on d1.Key equals d2.Key into kvp 
from nv in kvp.DefaultIfEmpty(d1) 
select nv).ToDictionary(x => x.Key, x => x.Value); 
+0

实际上这个工作。但我决定继续与foreach合作。 – 2010-07-15 14:06:58

+0

@Bobb好选择:) – 2010-07-15 15:15:50

4

你可以只遍历值DIC2:

Dictionary<double, double> dic1; 
Dictionary<double, double> dic2; 
foreach (var pair in dic2) 
{ 
    dic1[pair.Key] = pair.Value; 
} 

或者,如果要更新,但不插入,检查项存在:

foreach (var pair in dic2) 
{ 
    if (dic1.ContainsKey(pair.Key)) 
    { 
     dic1[pair.Key] = pair.Value; 
    } 
} 

编辑:如果你真的想使用Linq,你可能想创建一个新的字典,而不是更新现有的之一:

dic1 = 
    (from pair in dic1 
    let Value = dic2.ContainsKey(pair.Key) ? dic2[pair.Key] : pair.Value 
    select new { pair.Key, Value } 
    ).ToDictionary(pair => pair.Key, pair => pair.Value); 

dic1 = 
    (from pair in dic1 
    join pair2 in dic2 on pair.Key equals pair2.Key into g 
    select new { pair.Key, g.DefaultIfEmpty(pair).First().Value } 
    ).ToDictionary(pair => pair.Key, pair => pair.Value); 

在我看来,仅仅就更难读,虽然。

+0

。 – 2010-07-15 12:01:23

+0

这是LINQ的问题。 – 2010-07-15 12:16:26

+0

我在做foreach .. – 2010-07-15 13:06:06

0

试试这个:

var entries = dic2.Where(x => dic1.ContainsKey(x.Key)); 
foreach (KeyValuePair<double, double> entry in entries) 
{ 
    dic1[entry.Key] = entry.Value; 
} 
+0

啊 - 太迟了 - 你已经接受了以前的帖子作为答案。 – ChrisBD 2010-07-15 13:17:10