using System.Collections; class Application { // 迭代器的进度是在何时重置的 // 迭代器不支持 IEnumerator.Reset 方法。 若要从头开始重新迭代,必须获取新的迭代器。 static IEnumerable Data() { for (int i = 0; i < 3; i++) { yield return i; // 有多次return } // yield return不同的数据类型,是可以通过编译的 // 但是在Runtime,不能正确执行类型转换的话,还是会报错 // yield return "0"; // 函数执行到最后,才是真正的结束 } // 加上类型描述 static IEnumerable<int> DataInt() { yield return 0; // 返回值加了类型描述之后,就不能这么写了 // yield return "0"; } // 加上参数 static IEnumerable<int> DataIntRange(int l, int r) { for (int i = l; i <= r; i += 1) { yield return i * i; } } static void Main() { // 使用for循环遍历数据 foreach (int i in Data()) { Console.WriteLine(i.ToString()); } Console.WriteLine(); foreach (int i in DataIntRange(1, 3)) { Console.WriteLine(i.ToString()); } Console.WriteLine(); // 获取迭代器,手动迭代 var Enumerator = DataIntRange(1, 5).GetEnumerator(); while (Enumerator.MoveNext()) { Console.WriteLine(Enumerator.Current.ToString()); } Console.WriteLine(); var Fruits = new Fruit(); foreach (string Name in Fruits) { Console.WriteLine(Name); } } } // 可以用作迭代数据的类 class Fruit : IEnumerable { private string[] Fruits = { "Apple", "Banana", "Cat?" }; // 这个函数必须实现 public IEnumerator GetEnumerator() { for (int i = 0; i < Fruits.Length; i++) { yield return Fruits[i]; } } }