我应该使用 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 &gt; 0 将返回相同的结果(truefalse)还是两者不同?

请问,谁能帮我解决这个问题?

【问题讨论】:

【参考方案1】:

Any 会更快,因为(在您的情况下为IEnumerable &lt;object&gt;)一旦找到与您的条件匹配的第一个元素,它就会返回 true。

而 Count 必须一直到集合结束(读取迭代集合)才能得到结果。

Food4Thought: 1。你的会抛出异常,因为集合是null。 2。 object1.Where (s =&gt; s.IsActive); 将在 s.IsActive 上显示编译时异常,因为集合是 object 类型且 IsActive 不是对象类中的属性。将其更改为IEnumerable&lt;My_Class_Which_Have_Is_Active_Property&gt;

【讨论】:

这取决于 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) 还是计算结果行? [关闭]

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

PNG还是JPG?我应该使用哪一个? [复制]

我应该使用哪一个:os.sep 还是 os.path.sep?

Swift FMDB:我必须使用哪种方法?

ToList()、Any()、Count()、Sum() 上的 Linq 错误