在我們的代碼庫,我們有提供類似的方法,數據訪問層:這會調用GetEnumerator()多於一次嗎?
public IEnumerable<Foo> GetFoos()
{
var collection = new Collection<Foo>();
// ...call db
while (read results)
{
collection.Add(item);
}
return collection;
}
因此,儘管方法簽名返回一個IEnumerable,引擎蓋下,它創造了一個集合(這是已經列舉)。這種方法的用戶是否期待IEnumerable實際調用GetEnumerator(),或者他們實際上是否會在不知不覺中使用Collection?
IEnumerable<Foo> myFoos = GetFoos();
// will .Any() cause enumeration even though it's a Collection under the hood?
if (myFoos != null && myFoos.Any())
{
// ...
}
但是請注意,它只會查看它是否執行了'MoveNext',因爲這足以確定該集合具有* any *項目。所以當它調用'GetEnumerator'時,它*不會遍歷整個集合。 –
事實上 - 這對於一個系列來說非常有效。 –
是的,比較例如[Count()](http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,41ef9e39e54d0d0b)。因此'Count()> 0'必須遍歷整個集合,儘管它確實檢查源是否是'ICollection'並且在這種情況下使用'Count'屬性。 –