从字典中删除值为空列表的项目的最佳方法是什么?
IDictionary<int,Ilist<T>>
var foo = dictionary
.Where(f => f.Value.Count > 0)
.ToDictionary(x => x.Key, x => x.Value);
这将创建一个新字典。如果您想就地删除,乔恩的回答会成功。
好吧,如果您需要就地执行此操作,您可以使用:
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);
请注意,如果您有机会更改字典的构造方式,则可以考虑通过该方法创建一个ILookup
代替。ToLookup
这通常比每个值都是一个列表的字典更简单,即使它们在概念上非常相似。查找有一个很好的特性,如果你要求一个不存在的键,你会得到一个空序列而不是异常或空引用。
提供替代方案只是为了完整性。
或者(并且完全取决于您的使用情况),在动态修改列表内容时执行此操作,而不是在特定时间点进行批处理。在这种情况下,您可能无需迭代就知道密钥:
var list = dictionary[0];
// Do stuff with the list.
if (list.Count == 0)
{
dictionary.Remove(0);
}
其他答案解决了在整个字典中临时执行此操作的需要。