在上一篇文章中,说了下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,程序退出。运行结果如下:
通过方法二的实现,就可以直接遍历你的自定义对象了。