List<T> 任何或计数? [复制]
Posted
技术标签:
【中文标题】List<T> 任何或计数? [复制]【英文标题】:List<T> Any or Count? [duplicate] 【发布时间】:2011-08-10 03:24:15 【问题描述】:当我想对列表做某事时,我首先检查它是否不是null
或不包含任何元素(不要吹foreach
),我通常使用list.Any()
,但最好的选择是什么?使用list.Count > 0
,还是使用list.Any()
?
【问题讨论】:
每个风格指南:列表(集合,等等)永远不应该为空 - 而应该是空的...... 最好在枚举和集合上使用 Any()。如果有人觉得写 '(somecollection.Count > 0)' 会混淆或导致可读性问题,最好将其写为扩展方法,命名为 Any()。然后大家都很满意。性能方面和可读性方面。这样您的所有代码都将具有一致性,并且您项目中的个人开发人员不必担心选择 Count vs Any。 【参考方案1】: 如果您使用的是List
,请使用Count
,因为它知道自己的大小。
使用Length
作为Array
如果您只有IEnumerable
,我会使用.Any()
而不是.Count()
,因为它会更快,因为它会在检查一项后停止。
也可以看看这个问题:Which method performs better: .Any() vs .Count() > 0?
【讨论】:
不要! - 如果可以,总是使用Any
,因为它会尽可能地转换为Count
或Length
,并给出明确统一的意图。
@TaW 总是使用 Any,因为它会尽可能地转换为 Count 或 Length 你能用一些源代码来支持它吗,因为我不相信你。对不起。
我已经报告了我在各种 cmets 和帖子中发现的东西,但看着 sources 我有疑问。我仍然会推荐 Any() ,除非它涉及到访问数据库;但对于其他情况,我怀疑会有任何可衡量的性能影响(不确定这些演员是如何影响的)并且更清晰的代码仍然是一个很好的理由。
@Silvermind 在当前的 dotnet 运行时中,这将被使用:github.com/dotnet/runtime/blob/v5.0.5/src/libraries/System.Linq/… 对于 .NET 框架没有这样的检查,因此.Count
比.Any()
更受欢迎。有趣
嘿@Baklap4。我在这里也有同样的论点,如果你读了它,你会发现我可以让它崩溃,但我已经看到了源代码。 ;) ***.com/a/66824318/858757【参考方案2】:
我使用 list.Count > 0
只是因为它不依赖于 LINQ 方法,因此适用于 C# 2.0。
我个人像瘟疫一样避免使用 LINQ(因为它的速度很慢),而且这里根本没有理由使用扩展方法。
然而,更好的解决方案可能是制作您自己的版本的Any
,它会接收null
引用,如果它是与元素的集合。这将为您节省空检查。
【讨论】:
LINQ 可能比 for 循环慢;但它并没有那么慢,应该避免。我相信它对性能的小幅影响是值得的,因为它使代码更易于维护。【参考方案3】:.Any()
通常比.Count() > 0
更好用。这样做的原因是,如果您要迭代的项目不是 ICollection
,那么它必须迭代整个列表才能获得计数。
但是,如果项目是 ICollection
(List<T>
是),那么使用 Count()
(Any()
迭代一次,无论 MS .Net 中的底层类型如何)都一样快或在某些情况下更快但是当底层项目是ICollection
时,Mono会尝试将其优化为Count > 0
)
一个很棒的工具是Reflector,.Net 源代码和Mono source code,它可以让你看到事情是如何实现的。
【讨论】:
btw ... .NET Reflector 自第 7 版起不再免费。替代方案:ILSpy (wiki.sharpdevelop.net/ilspy.ashx) @Andreas Niedermair:为什么你说 IEnumerable如果您使用实体框架并且有一个包含许多记录的巨大表,Any() 会快得多。我记得有一次我想检查一张表是否为空,是否有数百万行。 Count() > 0 需要 20-30 秒才能完成。 Any() 是即时的。
【讨论】:
【参考方案5】:Any() 可以提高性能,因为它可能不必迭代集合来获取事物的数量。它只需要击中其中一个。或者,对于 LINQ-to-Entities,生成的 SQL 将是 IF EXISTS(...) 而不是 SELECT COUNT ... 甚至是 SELECT * ...。
【讨论】:
以上是关于List<T> 任何或计数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
哪个更好?数组、ArrayList 或 List<T>(在性能和速度方面)
为啥我在 List<List<T>> 中复制 List<T> 时存在依赖关系? [复制]
IEnumeration<T> 和 List<T> 之间的区别? [复制]