![](/img/trans.png)
[英]Most efficient way to query a database and then remove entries from returned items
[英]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.