繁体   English   中英

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

[英]Efficient way to remove items from dictionary

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

适当的方法是:

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

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

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

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

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

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

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

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

正如其他人所提到的,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 在此输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM