我有
IDictionary<string,object> d1;
Dictionary<string, object> d2;
我需要从d1中删除所有不在d2中的条目。
我知道我可以用for循环等来做到这一点,但这是上个世纪的事情;我想做得对。
我得
d1.Where(x => {return d2.ContainsKey(x.key);});
但不知道接下来该做什么
答案 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
以确保您在迭代时不修改集合。