考慮代碼:
class Program
{
static void Main(string[] args)
{
var test = new EnumTest();
test.ConsumeEnumerable2Times();
Console.ReadKey();
}
}
public class EnumTest
{
public IEnumerable<int> CountTo10()
{
for (var i = 0; i <= 10; i++)
yield return i;
}
public void ConsumeEnumerable2Times()
{
var enumerable = CountTo10();
foreach (var n in enumerable)
{
foreach (int i in enumerable)
{
Console.WriteLine("Outer: {0}, Inner: {1}", n, i);
}
}
}
}
此代碼將產生輸出:
Outer: 0, Inner: 1
Outer: 0, Inner: 2
...
Outer: 1, Inner: 0
Outer: 1, Inner: 1
...
Outer: 10, Inner: 10
使用IEnumerable的,你可以一遍又一遍枚舉相同的集合。 IEnumerable實際上會爲每個枚舉請求返回一個新的IEnumerator實例。
在上面的示例中EnumTest()方法被調用一次,但返回的IEnumerable被使用了兩次。每次獨立計數到10。
這就是爲什麼「多個消費者可以一次枚舉集合而不會相互干擾」。您可以將相同的IEnumerable對象傳遞給2個方法,並且它們將獨立枚舉集合。用IEnumerator你不能實現這一點。
對不起,我的英語。
你能引用你的參考嗎?在上下文中很難理解這一點。 – usr 2012-07-25 17:54:53
'IEnumerator'是有狀態的,通常代表被迭代的集合中的一個位置。共享一個枚舉器的多個線程需要使用一些同步方法來安全地使用一個。 IEnumerable接口允許每個線程獲得自己的枚舉器,它可以安全地使用而不需要與其他線程協作(除非底層集合發生變化,這是不安全的並且會導致拋出異常)。 –
Lee
2012-07-25 18:17:10