List<T> 任何或计数? [复制]

Posted

技术标签:

【中文标题】List<T> 任何或计数? [复制]【英文标题】:List<T> Any or Count? [duplicate] 【发布时间】:2011-08-10 03:24:15 【问题描述】:

当我想对列表做某事时,我首先检查它是否不是null 或不包含任何元素(不要吹foreach),我通常使用list.Any(),但最好的选择是什么?使用list.Count &gt; 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,因为它会尽可能地转换为CountLength,并给出明确统一的意图。 @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 &gt; 0 只是因为它不依赖于 LINQ 方法,因此适用于 C# 2.0。

我个人像瘟疫一样避免使用 LINQ(因为它的速度很慢),而且这里根本没有理由使用扩展方法。

然而,更好的解决方案可能是制作您自己的版本的Any,它会接收null 引用,如果它是与元素的集合。这将为您节省空检查。

【讨论】:

LINQ 可能比 for 循环慢;但它并没有那么慢,应该避免。我相信它对性能的小幅影响是值得的,因为它使代码更易于维护。【参考方案3】:

.Any() 通常比.Count() &gt; 0 更好用。这样做的原因是,如果您要迭代的项目不是 ICollection,那么它必须迭代整个列表才能获得计数。

但是,如果项目是 ICollectionList&lt;T&gt; 是),那么使用 Count()Any() 迭代一次,无论 MS .Net 中的底层类型如何)都一样快或在某些情况下更快但是当底层项目是ICollection时,Mono会尝试将其优化为Count &gt; 0

一个很棒的工具是Reflector,.Net 源代码和Mono source code,它可以让你看到事情是如何实现的。

【讨论】:

btw ... .NET Reflector 自第 7 版起不再免费。替代方案:ILSpy (wiki.sharpdevelop.net/ilspy.ashx) @Andreas Niedermair:为什么你说 IEnumerable 是邪恶的接口/类??? @Florian pfuh ... 1 年后 ... 没有计划 ... sry 朋友 - 我宁愿删除 cmt :) 从这个源代码看来,Mono 没有优化 Any() 到 Count > 0(它似乎与 .net 实现相同):github.com/mono/mono/blob/master/mcs/class/referencesource/…【参考方案4】:

如果您使用实体框架并且有一个包含许多记录的巨大表,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> 时存在依赖关系? [复制]

List<T> 到 T[] 不复制

IEnumeration<T> 和 List<T> 之间的区别? [复制]

C#利用GridView对IList<T>或List<T>进行插入、删除和修改

C# 中 List<T> 的只读冲突? [复制]