考虑代码:
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 被使用了 2 次。每次独立数到 10。
这就是为什么“几个消费者可以一次枚举集合而不会相互干扰”。您可以将相同的 IEnumerable 对象传递给 2 个方法,它们将独立枚举集合。使用 IEnumerator 你无法做到这一点。
对不起我的英语。