作者:百变精灵621126 | 来源:互联网 | 2024-11-17 10:45
本文通过一个简单的示例,详细介绍了如何在C#中使用yieldreturn和yieldbreak关键字来实现延迟迭代和提前终止循环的功能。希望对你的开发工作有所帮助。
在今天的项目中,我遇到了需要实现延迟迭代的需求,因此编写了以下示例代码,希望能对你有所启发。
代码如下:
using System;
using System.Collections.Generic;
namespace ConAppYield
{
class Program
{
static void Main(string[] args)
{
// 使用 yield return 的主要优势在于延迟遍历,即在实际遍历数据时才会执行相应的代码。LINQ 中的许多扩展方法(如 select)都利用了这一特性。
Console.WriteLine("==偶数年龄如下:==");
IEnumerable query = Students.GetEvenNumbers();
foreach (var item in query)
{
Console.WriteLine(item);
}
// 以下是使用 do-while 循环模拟 C# 中的 foreach 循环,实际上 foreach 循环只是 C# 的一种语法糖。
// 同时,foreach 循环也体现了迭代模式的设计思想。
Console.WriteLine("==下面用 do-while 模拟 C# 中的 foreach 循环,说到底,foreach 循环只是 C# 的语法糖而已! ==");
Console.WriteLine("==同时,foreach 循环也是一种设计模式,叫 迭代模式==");
IEnumerator newQuery = query.GetEnumerator();
int i = 0;
while (newQuery.MoveNext())
{
i++;
Console.WriteLine("集合中的第 " + i + " 个数:" + newQuery.Current);
}
Console.ReadKey();
}
}
class Students
{
private static readonly int[] ages = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
public static IEnumerable GetEvenNumbers()
{
int agesLength = ages.Length;
for (int i = 0; i {
if (ages[i] % 2 == 0)
{
yield return ages[i];
}
else
{
// yield break; // 使用 yield break 可以提前终止循环,即:只要遇到非偶数,立即终止循环
}
}
/* 下面的写法是错误的:无法在包含 catch 子句的 try 块中生成值 */
/*
try
{
foreach (var item in ages)
{
if (item % 2 == 0)
{
yield return item;
}
}
}
catch (Exception)
{
throw;
}*/
}
}
}
感谢阅读!