我有两个字典 dict1 和 dict2,我想使用它的键从 dict1 中删除 dict2 中存在的项目。不是遍历dict2并使用“ContainsKey”方法,而是有任何其他方法,例如使用linq。
问问题
5552 次
3 回答
9
执行此操作的适当方法是:
foreach(var key in dic2.Keys)
{
dic1.Remove(key);
}
LINQ 代表语言集成查询。它用于对数据执行查询。查询不会改变底层结构。由于您想要做的是改变其中一个查询 LINQ 不是一个合适的工具。
另请注意,它Remove
返回一个布尔值,指示它是否实际删除了密钥。它不会抛出异常。您不需要ContainsKey
在调用 remove 之前调用(这将为您节省每个项目的额外表查找)。
于 2012-09-07T14:47:15.727 回答
1
Linq 也在使用循环。Linq 可以帮助您找到要删除的内容。
foreach (var kv in dict2.Where(kv => dict1.ContainsKey(kv.Key)))
dict1.Remove(kv.Key);
这应该是有效的,因为它使用ContainsKey
which is a O(1) operation, for every KeyValuePair
in the second Dictionary
。
http://msdn.microsoft.com/en-us/library/kabs04ac.aspx
编辑:当然,Servy 的方法通常更好,因为Dictionary.Remove
即使给定的密钥不存在,您也可以使用。
于 2012-09-07T14:46:53.887 回答
-2
正如其他人所提到的,linq 是否是这项工作的正确工具是值得商榷的。但是,如果它必须是 linq,我相信这是适当的解决方案:
var dict1 = new Dictionary<int,double>();
var dict2 = new Dictionary<int,double>();
dict1 = dict1.Where(kv => !dict2.ContainsKey(kv.Key))
.ToDictionary(kv => kv.Key, kv=>kv.Value);
这不会从现有字典中删除键,而是生成一个仅包含所需键的新字典。
如果必须删除大部分键,这实际上可能会更快。
ps
于 2012-09-07T15:02:17.153 回答