从字典中删除项目的有效方法

时间:2012-09-07 14:40:27

标签: c# linq linq-to-objects

我有两个词典dict1和dict2,我想从dict2中删除dict2中使用其键的项目。而不是循环通过dict2并使用“ContainsKey”方法,我还有其他方法,如使用linq。

3 个答案:

答案 0 :(得分:9)

执行此操作的适当方法是:

foreach(var key in dic2.Keys)
{
    dic1.Remove(key);
}

LINQ代表语言集成 查询 。它用于对数据执行查询。查询不会改变底层结构。因为你要做的是改变其中一个查询LINQ不是一个合适的工具。

另请注意,Remove返回一个布尔值,指示它是否实际删除了密钥。它没有抛出异常。在调用remove之前,您不需要调用ContainsKey(这将为每个项目节省额外的表查找)。

答案 1 :(得分:1)

Linq也在使用循环。 Linq可以帮助您找到想要删除的内容。

foreach (var kv in dict2.Where(kv => dict1.ContainsKey(kv.Key))) 
    dict1.Remove(kv.Key);

这应该是高效的,因为对于第二个KeyValuePair中的每个Dictionary,它使用ContainsKey这是一个O(1)操作。

http://msdn.microsoft.com/en-us/library/kabs04ac.aspx

编辑:当然,Servy的方法通常更好,因为即使给定的密钥不存在,您也可以使用Dictionary.Remove

答案 2 :(得分:-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);

这不会从现有词典中删除键,而是生成一个只包含所需键的新词典。

如果必须删除大部分密钥,这实际上可能会更快。

P.S。 enter image description here