class Program
{
static void Main(string[] args)
{
List<int> a = new List<int>();
a.Add(3);
a.Add(7);
a.Add(2);
a.Add(5);
a.Add(9);
foreach (var item in FilterByYield(a))
{
Console.WriteLine(item);
}
foreach (var item in FilterDatas(a))
{
Console.WriteLine(item);
}
Console.Read();
}
static IEnumerable<int> FilterDatas(List<int> a)
{
List<int> result = new List<int>();
foreach (int tmp in a)
{
if (tmp > 3)
{
result.Add(tmp);
}
}
return result;
}
static IEnumerable<int> FilterByYield(List<int> a)
{
foreach (int tmp in a)
{
if (tmp>3)
{
yield return tmp;
}
}
yield break;
}
}
总结:
通过单步调试发现:
虽然2种方法的输出结果是一样的,但运作过程迥然不同。第一种方法,是把结果集全部加载到内存中再遍历;第二种方法,客户端每调用一次,yield return就返回一个值给客户端,是"按需供给"。
第一种方法,客户端调用过程大致为:
使用yield return,客户端调用过程大致为: