簡體   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