2013-05-02 107 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在整个字典。