2013-02-10 45 views
1

在枚举枚举之前调用.Any()方法是否有任何好处?例如(准许该列表是IEnumerable):在枚举枚举之前通过IEnumberable调用Any()的好处是什么?

if(list != null && list.Any()) 
{ 
    foreach(var item in list) 
    { 
     // do stuff 
    } 
} 

我怀疑它没有,但我宁愿确定。

+2

@DavidL这假定它实现'ICollection'而不只是'IEnumerable' – CodesInChaos 2013-02-10 15:49:20

+0

你会期待什么好处?性能优势? – 2013-02-10 15:49:35

+2

它实际上有一个缺点:'list'被枚举两次。你应该避免使用'IEnumerable ',因为并不是所有的人都支持这一点。 – CodesInChaos 2013-02-10 15:50:13

回答

2

没有真正的好处,但在这里调用Any可能有缺点,因为您可能会枚举两次。

空检查应该足够了。该foreach将照顾其余的你。

+0

其实,如果我没有记错,.Any()只会对.MoveNext()进行一次调用,所以是的,它会被枚举,但不是整个枚举。 – 2013-02-10 16:10:41

+3

@SebastienF它取决于提供者。所以这是一个潜在的缺点。 – manojlds 2013-02-10 16:13:29

0

不,不是真的。如果列表为空,则您的foreach循环将不会迭代。

if(list != null) 
{ 
    foreach(var item in list) 
    { 
     // do stuff 
    } 
} 
+1

-1对于Any与Count()> 0的不必要的和错误的比较,特别是IEnumerable。 Count()将始终枚举所有元素。任何不需要。 – manojlds 2013-02-10 16:08:34

+0

伤心,我不能-1你无法阅读。你在我身后看到括号“Count”属性吗? – bas 2013-02-10 16:10:17

+0

IEnumerable有Count属性吗? – manojlds 2013-02-10 16:12:33

0

不,没有真正的好处。

如果列表不为null,但为空,则foreach将会正常(即它不会抛出异常并且不会枚举空列表)。 做空检查应该足够了。