首页 > 代码库 > yield关键字的用法

yield关键字的用法

在上一篇文章中,说了下foreach的用法,但是还是比较复杂的,要实现接口才能进行遍历,有没有简单些的方法呢?答案是肯定的。且看下面。

yield关键字的用法:

1.为当前类型添加一个任意方法,但是要求该方法的返回值类型必须是IEnumerable:<代码1-1>

 1     class Person 2     { 3         public string Name { get; set; } 4         public int Age { get; set; } 5  6         public string[] _Name = new string[] { "zxh", "jk", "ml", "wcw", "sk", "yzk" }; 7  8         public IEnumerable<string> GetEnumerableObject() 9         {10             for (int i = 0; i < _Name.Length; i++)11             {12                 yield return _Name[i];13             }14         }15     }

遍历的方法如下:<代码1-2>

1            Person p1 = new Person();2             foreach (var item in p1.GetEnumerableObject())3             {4                 Console.WriteLine(item);5             }6             Console.ReadKey();

2.为当前类型添加一个GetEnumerator()方法,返回值类型是IEnumerator.<代码1-3>

 1    class Person 2     { 3         public string Name { get; set; } 4         public int Age { get; set; } 5  6         public string[] _Name = new string[] { "zxh", "jk", "ml", "wcw", "sk", "yzk" }; 7  8         //为当前类型添加一个GetEnumerator()方法,返回值类型是IEnumerator. 9         public IEnumerator<string> GetEnumerator()10         {11             for (int i = 0; i < _Name.Length; i++)12             {13                 yield return _Name[i];      //yield break;则跳出循环。14             }15         }16     }

遍历的方法如下:<代码1-4>

1            Person p1 = new Person();2             foreach (var item in p1)3             {4                 Console.WriteLine(item);5             }6             Console.ReadKey();
yield break的用法,我们在代码1-3修改一下:<代码1-5>
 1 class Person 2     { 3         public string Name { get; set; } 4         public int Age { get; set; } 5  6         public string[] _Name = new string[] {  "jk", "ml","zxh", "wcw", "sk", "yzk" }; 7  8         //为当前类型添加一个GetEnumerator()方法,返回值类型是IEnumerator. 9         public IEnumerator<string> GetEnumerator()10         {11             for (int i = 0; i < _Name.Length; i++)12             {13                 if (_Name[i] == "zxh")14                 {15                     yield break;  //跳出循环16                 }17                 else18                 {19                     yield return _Name[i]; 20                 }21             }22         }23     }

当再执行<代码1-4>时,会发现遍历到zxh,程序退出。运行结果如下:

通过方法二的实现,就可以直接遍历你的自定义对象了。