【发布时间】:2010-09-07 15:58:55
【问题描述】:
确定列表是否为空的“最佳”(同时考虑速度和可读性)方法是什么?即使列表是 IEnumerable<T> 类型并且没有 Count 属性。
现在我在这之间折腾:
if (myList.Count() == 0) { ... }
还有这个:
if (!myList.Any()) { ... }
我的猜测是第二个选项更快,因为它会在看到第一个项目后立即返回结果,而第二个选项(对于 IEnumerable)将需要访问每个项目以返回计数.
话虽如此,第二个选项对您来说是否可读?你更喜欢哪个?或者您能想出更好的方法来测试空列表吗?
编辑 @lassevk 的响应似乎是最合乎逻辑的,再加上一些运行时检查以尽可能使用缓存计数,如下所示:
public static bool IsEmpty<T>(this IEnumerable<T> list)
{
if (list is ICollection<T>) return ((ICollection<T>)list).Count == 0;
return !list.Any();
}
【问题讨论】:
-
最好不要混合使用
is和cast,而是使用as和null检查:ICollection<T> collection = list as ICollection<T>; if (collection != null) return colllection.Count; -
为什么要多写一个方法?
list.Any()不等于list.IsEmpty吗?框架方法应该被优化——只有当你发现它是一个性能瓶颈时才值得写一个新的。 -
是否有人费心衡量他们建议的实现的性能,还是每个人都只是提出想法?
-
我建议向 .NET Core 类库添加
IsEmpty扩展方法的问题。 github.com/dotnet/corefx/issues/35054如果您喜欢并同意,请查看并投票。