C# 中的 .Any 和 .Count 更有效的是啥(扩展方法)[重复]
Posted
技术标签:
【中文标题】C# 中的 .Any 和 .Count 更有效的是啥(扩展方法)[重复]【英文标题】:What's more efficient in .Any and .Count in C# (Extension methods) [duplicate]C# 中的 .Any 和 .Count 更有效的是什么(扩展方法)[重复] 【发布时间】:2015-11-12 23:09:12 【问题描述】:public void MethodName(ObservableCollection<DataCollection> dataCollection)
if (dataCollection != null)
IsChecked = dataCollection.Any(o => o.DataCollectionID.Equals(30));
IsChecked = dataCollection.Where(o => o.DataCollectionID.Equals(30)).Count() > 0;
谁能解释一下,从以上两种过滤中使用最有效的方法是什么? 。任何?或.Where.Count?
注意:考虑 dataCollection 有超过 10,000 个项目。
请给我建议。谢谢
【问题讨论】:
我的建议是自己测试一下。 使用Any
,只要满足条件,方法就会终止。对于Count
,它必须一直走到最后。这确实是您应该通过一些研究就能找到的东西。
over 10,000 items
这并不多。对我来说听起来像是微优化。这甚至是你的瓶颈吗?你的简介说什么?如果您只想为此进行微优化,请一起跳过 LINQ。或者至少只是 PLINQ。
【参考方案1】:
审查框架...这取决于。我在假设领域的最初直觉:
Any()
检查是否存在单个值。如果是这样,那么它 返回真。这是一个 O(1) 操作。
Count()
必须执行以下任一操作:1) 访问集合中项目的运行计数,或 2) 计数 集合中的项目
在最好的情况下(#1),操作是 O(1)。在最坏的情况下,(#2),它是 O(n)。
实际上,Any()
使用集合的迭代器来确定是否存在下一个值。因此,Any()
是否是 O(1) 操作取决于集合。如果它是一个糟糕的实现,它可能是 O(n)。
例如,假设 Array 迭代器是愚蠢的,它会寻找第一个非空值。它必须检查数组中的每一项,因此Any()
在这种情况下意味着 O(n)。 (事实上,Any()
会为任何长度 > 1 的数组返回 true
)。
Count()
尝试查看集合是否实现了ICollection
或ICollection<T>
,如果是,则返回Count
属性的值。如果底层实现保持一个正在运行的选项卡,那可能是 O(1)。如果不是,则可能是 O(n) 最坏的情况。
如果可枚举的没有实现这些接口之一,Count()
只是迭代整个集合,在路上计数。这是 O(n)。
tl;dr:根据实现,Any()
更有可能比Count()
快得多。
【讨论】:
我相信数字 1 在最好的情况下是 O(1),但在平均情况下是 O(n/2)(所以 O(n))。数字 2 始终为 O(n)。显然数字 1 通常效率更高,但绝对不是每次都 O(1)(恒定时间)。 @johnnyRose 在一般情况下? (仅供参考,我现在正在检查源代码)......那将是一个糟糕的设计。您是否正在考虑数组末尾的一项?是的,我可以看到。 BRB。O(1)
for Any
将是最好的情况。并非总是如此。
@Habib 是的。检查来源会有所帮助。以上是关于C# 中的 .Any 和 .Count 更有效的是啥(扩展方法)[重复]的主要内容,如果未能解决你的问题,请参考以下文章
什么时候 ArrayList 比在 C# 中使用数组更有效? [复制]