从字典中删除值为空列表的项目

Mar*_*aro 8 c# dictionary .net-3.5

从值为空列表的字典中删除项目的最佳方法是什么?

IDictionary<int,Ilist<T>> 
Run Code Online (Sandbox Code Playgroud)

Jus*_*son 20

var foo = dictionary
    .Where(f => f.Value.Count > 0)
    .ToDictionary(x => x.Key, x => x.Value);
Run Code Online (Sandbox Code Playgroud)

这将创建一个新的字典.如果你想要就地删除,Jon的答案就可以解决问题.

  • 我会将`f.Value.Count> 0`改为`f.Value.Any()` (4认同)

Jon*_*eet 14

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

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

或者如果您对创建词典感到满意:

var noEmptyValues = dictionary.Where(pair => pair.Value.Count > 0)
                              .ToDictionary(pair => pair.Key, pair => pair.Value);
Run Code Online (Sandbox Code Playgroud)

请注意,如果您有机会更改字典的构造方式,则可以考虑ILookup通过该ToLookup方法创建字典.这通常比字典更简单,其中每个值都是一个列表,即使它们在概念上非常相似.查找具有很好的功能,如果您要求缺少键,则会得到一个空序列而不是异常或空引用.

  • @Maro:是的,它会创建一个新列表(以避免在修改字典时迭代字典) - 但它仍然会改变原始字典.这是第一个和第二个版本之间的区别......有时您需要能够更改现有集合而不是创建替换集合.您的问题没有在此处指定要求. (2认同)