2013-02-10 53 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將會正常(即它不會拋出異常並且不會枚舉空列表)。 做空檢查應該足夠了。