标签:
List<int> list = new List<int>() { 1,2,3,4 }; // 需求:返回所有大于n的数 // 方法1(不使用yield return) IEnumerable<int> WithoutYield(List<int> list, int n) { List<int> result = new List<int>(); foreach (int i in list) { if (i > n) { result.Add(i); } } return result; } // 方法2(使用yield return) IEnumerable<int> UseYieldReturn(List<int> list, int n) { foreach (int i in list) { if (i > n) { yield return i; } } }
// 调用 void Call() { foreach (int i in WithoutYield(list, 2)) { Console.WriteLine(i + "without yield"); } foreach (int i in UseYieldReturn(list, 2)) { Console.WriteLine(i + "with yield"); } }
区别:方法1是先将所有大于n的数加载到内存中
方法2是每调用一次返回一个值,是按需供给
结论:想得到一个IEnumerable<T>类型的集合,但是又不想一次性将数据加载到内存中,则可以使用yield return 实现按需供给
通俗理解:yield return以后,下次再调用这个方法,则从上次 yield return的地方继续执行(上次yield return之前的代码 在这次调用中不执行了~~)。
使用yield break,可以退出迭代。
标签:
原文地址:http://www.cnblogs.com/FangZhaohu/p/5410777.html