2

我有两个字典 dict1 和 dict2,我想使用它的键从 dict1 中删除 dict2 中存在的项目。不是遍历dict2并使用“ContainsKey”方法,而是有任何其他方法,例如使用linq。

4

3 回答 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);

这应该是有效的,因为它使用ContainsKeywhich is a O(1) operation, for every KeyValuePairin 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 回答