// 定义数据源
int[] scores = new int[] { 97, 92, 81, 60 };
// 定义查询语句
IEnumerable scoreQuery = scores.Where(o=>o>80); //from score in scores where score > 80 select score;
foreach (int p in scoreQuery)
{
Console.Write(p + " ");
int[] scores = new int[] { 97, 92, 81, 60 };
// 定义查询语句
IEnumerable scoreQuery = scores.Where(o=>o>80); //from score in scores where score > 80 select score;
foreach (int p in scoreQuery)
{
Console.Write(p + " ");
}
红色代码实际上没执行逻辑,只是返回一个可迭代接口,不管这个数组多大,他都立即返回。延迟执行
在调试中,Console.Write(p + " ");执行后会返回到红色代码。where 的源码是这样
private static IEnumerable<TSource> WhereIterator<TSource>(IEnumerable<TSource> source, Func<TSource, int, bool> predicate)
{
int index = -1;
foreach (TSource item in source)
{
index = checked(index + 1);
if (predicate(item, index))
{
yield return item;
}
}
}
关键在红色代码,第一次进入会在进入foreach之前返回,并保留住返回的位置;第二次进入接着上次的地方执行;即所谓状态机。