我应该使用 Any() 还是 Count() ?哪个更快?如果 IEnumerable 对象中存在任何数据,两者都会返回相同的输出(真或假)吗? [复制]
Posted
技术标签:
【中文标题】我应该使用 Any() 还是 Count() ?哪个更快?如果 IEnumerable 对象中存在任何数据,两者都会返回相同的输出(真或假)吗? [复制]【英文标题】:Which i should use Any() or Count() ? And which one is faster? Will both return same output(True or false) if any data exists in IEnumerable object? [duplicate] 【发布时间】:2014-09-05 11:34:31 【问题描述】:我在 asp.net mvc 控制器中有下面类似的代码...
IEnumerable<object> object = null;
IEnumerable<object1> object1 = null;
object = object1.where(s=>s.IsActive);
If(object.Any())
...
或
if(object.Count > 0)
...
我的问题是,如果“对象”中存在任何数据,object.Any()
和 object.Count > 0
将返回相同的结果(true
或 false
)还是两者不同?
请问,谁能帮我解决这个问题?
【问题讨论】:
【参考方案1】:Any
会更快,因为(在您的情况下为IEnumerable <object>
)一旦找到与您的条件匹配的第一个元素,它就会返回 true。
而 Count 必须一直到集合结束(读取迭代集合)才能得到结果。
Food4Thought:
1。你的会抛出异常,因为集合是null
。
2。 object1.Where (s => s.IsActive);
将在 s.IsActive
上显示编译时异常,因为集合是 object
类型且 IsActive
不是对象类中的属性。将其更改为IEnumerable<My_Class_Which_Have_Is_Active_Property>
。
【讨论】:
这取决于 IEnumerable 的实际类型。对于集合,Count() 将简单地返回 Count 属性的值。 @Dirk:我提到“在你的情况下” 当然,但我认为将对象设置为 null 并不是真正的代码(至少我希望如此),所以我们不知道实际的类型。 @Dirk:还是IEnumerable
。【参考方案2】:
Count() 需要遍历整个集合。 Any() 在遇到第一项时返回。
Any() 更快。
【讨论】:
【参考方案3】:我会推荐 Any()。
它更简洁,更易于阅读,并且不需要计算所有元素来产生返回值。
很大程度上取决于底层类型。在您的情况下 IENumerable (IE not IQueryable 下面有 ORM)差异可以忽略不计 - 取决于集合的大小。使用像 EF Any 这样的 ORM 可以证明性能要好得多。
【讨论】:
我同意 Any 的语义表明它会提高性能,但这完全取决于底层枚举器的实现。在某些情况下,这可能不会更快,但正如您所说,它很可能是。以上是关于我应该使用 Any() 还是 Count() ?哪个更快?如果 IEnumerable 对象中存在任何数据,两者都会返回相同的输出(真或假)吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 中哪一个更快? COUNT(id) 还是计算结果行? [关闭]