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,可以退出迭代。
转载于:https://www.cnblogs.com/FangZhaohu/p/5410777.html
相关资源:JAVA上百实例源码以及开源项目