linq one liner从IDictionary中删除其键不在另一个Dictionary中的元素

时间:2013-01-31 20:04:02

标签: c# linq .net-4.0 dictionary

我有

IDictionary<string,object> d1;
Dictionary<string, object> d2;

我需要从d1中删除所有不在d2中的条目。

我知道我可以用for循环等来做到这一点,但这是上个世纪的事情;我想做得对。

我得

   d1.Where(x => {return d2.ContainsKey(x.key);});

但不知道接下来该做什么

2 个答案:

答案 0 :(得分:3)

LINQ不是为修改现有元素而设计的 - 但您始终可以创建 new 字典。例如:

d1 = d1.Where(x => d2.ContainsKey(x.Key))
       .ToDictionary(x => x.Key, x => x.Value);

或者:

d1 = d1.Keys.Intersect(d2.Keys)
       .ToDictionary(key => x.Key, key => d1[key]);

正如其他人所说,如果你更热衷于进行Remove操作,我只是循环。例如:

foreach (var key in d1.Keys.Except(d2.Keys).ToList())
{
    d1.Remove(key);
}

(顺便说一句,我不知道为什么你在示例代码中使用了语句lambda。)

答案 1 :(得分:1)

LINQ用于查询。您查询的信息是d1中不在d2的密钥。除了错过NOT之外(除非你没有说&#34;不是&#34;在你的要求中)。你已经拥有了。当涉及实际某事时,最好用foreach循环完成,而不是LINQ:

foreach(var pair in d1.Where(x=> !d2.ContainsKey(x.Key)).ToList())
{
    d1.Remove(pair.Key)
}

请注意,需要ToList以确保您在迭代时不修改集合。