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                 else
18                 {
19                     yield return _Name[i]; 
20                 }
21             }
22         }
23     }

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

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

原文地址:https://www.cnblogs.com/chens2865/p/3861713.html