2013-05-02 113 views

回答

12
var foo = dictionary 
    .Where(f => f.Value.Count > 0) 
    .ToDictionary(x => x.Key, x => x.Value); 

這將創建一個新的字典。如果你想在原地移除,喬恩的答案將會成功。

+0

@ClaudioRedi - 謝謝,我剛剛注意到這個錯誤。 :) – 2013-05-02 14:40:45

+2

我會改變'f.Value.Count> 0'到'f.Value.Any()' – bnu 2017-02-02 13:45:52

10

好吧,如果你需要就地執行此操作,您可以使用:

var badKeys = dictionary.Where(pair => pair.Value.Count == 0) 
         .Select(pair => pair.Key) 
         .ToList(); 
foreach (var badKey in badKeys) 
{ 
    dictionary.Remove(badKey); 
} 

或者,如果你很高興創造了新字典

var noEmptyValues = dictionary.Where(pair => pair.Value.Count > 0) 
           .ToDictionary(pair => pair.Key, pair => pair.Value); 

請注意,如果您有機會改變字典的構建方式,則可以考慮通過ToLookup方法創建ILookup。這通常比字典中的每個值都是列表簡單,即使它們在概念上非常相似。查找具有很好的功能,如果您要求缺席密鑰,您會得到一個空序列,而不是一個例外或空引用。

+0

當調用ToList()時,會創建一個新列表?我沒有看到創建新列表或創建新詞典的不同之處。 – Maro 2013-05-02 14:42:44

+2

@Maro:是的,它會創建一個新列表(以避免在修改字典時對其進行迭代) - 但是它仍會改變原始字典。這是第一個和第二個版本之間的區別......有時您需要能夠更改現有的集合,而不是創建替代集合。你的問題沒有在這裏詳細說明要求。 – 2013-05-02 14:44:04

+0

謝謝,我明白了你的觀點。 +1 – Maro 2013-05-02 14:52:57

0

替代方案僅供參考。

或者(並且完全取決於您的使用情況),請在修改列表內容時立即修改列表內容,而不是在特定時間點批量修改列表內容。在這樣的時刻很可能你會知道的關鍵,而不必重複:

var list = dictionary[0]; 

// Do stuff with the list. 

if (list.Count == 0) 
{ 
    dictionary.Remove(0); 
} 

其他的答案解決需要做的ad-hoc在整個字典。