我有
IDictionary<string,object> d1;
Dictionary<string, object> d2;
我需要从 d1 中删除所有不在 d2 中的条目。
我知道我可以用 for 循环等来做到这一点,但那是上个世纪的事了;我想把它做好。
我得
d1.Where(x => {return d2.ContainsKey(x.key);});
但不知道下一步该怎么做
我有
IDictionary<string,object> d1;
Dictionary<string, object> d2;
我需要从 d1 中删除所有不在 d2 中的条目。
我知道我可以用 for 循环等来做到这一点,但那是上个世纪的事了;我想把它做好。
我得
d1.Where(x => {return d2.ContainsKey(x.key);});
但不知道下一步该怎么做
LINQ 并非旨在修改现有元素 - 但您始终可以创建一个新字典。例如:
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。)
LINQ 用于查询。您要查询的信息是d1
不在d2
. 除了缺少 a NOT
(除非您不是在您的要求中说“不”)。你已经有了。在实际做某事时,最好使用foreach
循环而不是 LINQ:
foreach(var pair in d1.Where(x=> !d2.ContainsKey(x.Key)).ToList())
{
d1.Remove(pair.Key)
}
请注意,ToList
需要确保在迭代集合时不会修改集合。