2014-02-06 18 views
-4

使用LINQ,如果物品鍵不在列表中,是否有方法可以從字典中刪除所有項目?刪除鍵中不存在的詞典中的數據

像這樣的職位的答案,我做這樣的:

var keys = dict.Where(kvp => !list.Contains(kvp.Key)).ToList(); 


foreach(va key in keys){dict.Remove(k);} 

我只是好奇,找到另一種方式來做到這一點...

+0

很顯然,我有沒有LINQ經典的方式嘗試... – Maxime

+0

@Maxime'我只是好奇,想另謀出路這樣做......'你有其他答案.. –

回答

1

關鍵是你無法循環字典;你必須首先拿到鑰匙的名單,否則foreach循環會失敗:

var keys = dict.Where(kvp => !list.Contains(kvp.Key)).ToList(); 

foreach(var key in keys) 
{ 
    dict.Remove(key); 
} 
+0

由於延遲執行,您在迭代集合的同時進行變更,儘管您在文章中特別警告了這種可能性。 – Servy

+0

@Servy:ToList立即評估查詢並從結果中創建一個List <>。 'foreach'循環處理*列表*,而不是查詢。因此,D斯坦利的解決方案將正常工作。 –

+0

@JonSenchyna他在我評論10分鐘後編輯它。看看修訂歷史。 – Servy

6
foreach(var key in dict.Keys.Except(list).ToList()) 
{ 
    dict.Remove(key); 
} 
+4

這將導致異常:'集合被修改;枚舉操作可能無法執行。' – Habib

+1

或'myDictionary.Keys.Except(myList).ToList()。ForEach(k => myDictionary.Remove(k))' –

+0

@Habib:在末端對「ToList」的調用立即評估linq查詢並將結果放入新列表中。由於QtX列舉了這個列表,而不是'dict.Keys'本身,'foreach'循環不會產生這個異常。 –