下面的代码块显示MyList中大于2的数字。
using System;
using System.Collections.Generic;
namespace CSharpBasics
{
internal class Program
{
private static List<int> MyList = new List<int>();
private static void Main(string[] args)
{
MyList.Add(1);
MyList.Add(2);
MyList.Add(3);
MyList.Add(4);
var test = FilterWithYield();
foreach (int i in test)
{
Console.WriteLine(i);
}
Console.ReadLine();
}
private static IEnumerable<int> FilterWithYield()
{
foreach (int i in MyList)
{
if (i > 2)
{
yield return i;
}
}
}
}
}
现在,当我们将断点设置为行foreach (int i in test)
时,在执行 foreach
循环之前,test
变量将具有FilterWithYield()
的结果。怎么可能?我的理解是,直到迭代开始,IEnumerable方法才永远不会执行。
我在这里想念什么吗?
谢谢。
答案 0 :(得分:6)
查看警告-Expanding the Result View will enumerate the IEnumerable…
,通过查看结果视图,您可以枚举值。
答案 1 :(得分:2)
test
是可枚举的-本质上是枚举数提供者;枚举时,枚举器将被迭代。现在;枚举数和可枚举通常是不同的,但是可枚举(test
)仍然是 something ,并且 something 仍然具有IDE可以探测的状态。 IDE可以检测可枚举,并为您迭代它们以显示内容。实际上,在某些情况下(顺序不可重复),这可能非常不便。因此,IDE在单击它之前确实警告过您-请参阅“扩展结果视图将枚举IEnumerable”。