foreach()中的yield的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。转载请在文章结尾显眼处附带博主文章地址。 https://blog.csdn.net/qq_27559331/article/details/52865874

通过foreach 语句降低了枚举的复杂度。>可枚举类型(具有GetEnumerator()方法)、枚举器(具有IEnumerator接口中的成员的类)>IEnumerable实现该接口即为可枚举类型>IEnumerator实现该接口为枚举器>foreach遍历类型推断为object而不是实际类型,需要实现泛型版本的接口>快捷语法:yield(yield含义:生产, 出产, 带来) yield return 表达式 yield break; 当yield语句所在的方法的返回值为IEnumerable时,表示自动生成一个可迭代类型 当yield语句所在的方法的返回值为IEnumertor时,表示自动生成一个迭代器 通过yield快速为某类型创建正向与反向迭代器演示通过IEnumerator接口遍历序列。GetEnumerator()方法。foreach遍历修改数据???绝对不行。//1.foreach循环是只读的。不能用来修改数据。//2.foreach循环式只进的,并且是一条一条循环的。>其实通过foreach遍历数据,实际上是调用了一个"枚举器"来遍历数据,和foreach一点关系都没有,foreach只是一个语法上的简化而已。>凡是具有GetEnumerator这个方法的类型都能使用foreach来遍历//一般情况下什么样的类可以用foreach来遍历//实现IEnumerable接口的,只要实现该接口肯定会有GetEnumerator()方法。迭代器就是循环的意思#region 手动写一个"枚举器" \ 使用yield生成一个"枚举器"手动写一个"枚举器"namespace _06foreach循环{ class Program { static void Main(string[] args) { //Person p=new Person(); //IEnumerator etor = p.GetEnumerator(); //while (etor.MoveNext()) //{ // Console.WriteLine(etor.Current.ToString()); //} //Console.WriteLine("OK"); Person p = new Person(); foreach (string item in p) { Console.WriteLine(item); } Console.ReadKey(); } } //1.需要让该类型实现一个名字叫IEnumerable的接口,实现该接口的主要目的是为了让当前类型中增加一个名字叫GetEnumerator的方法(增加方法后其实可以把接口删除) public class Person : IEnumerable { private string[] Friends = new string[] { "黄林", "许正龙", "彭德怀", "杨硕" }; public string Name { get; set; } public int Age { get; set; } public string Email { get; set; } //这个方法的作用就是返回一个"枚举器" public IEnumerator GetEnumerator() { //该写什么代码 return new PersonEnmerator(this.Friends); } } //这个类就是一个"枚举器" //希望一个类被"枚举(遍历)",就要实现一个类,该类就是一个"枚举器" public class PersonEnmerator : IEnumerator { public PersonEnmerator(string[] fs) { _fsiends = fs; } private string[] _fsiends; //一般下标都是一开始指向类第一条的前一条 private int index = -1; public object Current//当前对象 { get { if (index>=0&&index<_fsiends.Length) { return _fsiends[index]; } else { throw new IndexOutOfRangeException(); } } } public bool MoveNext()//向后移动一个 { if (index + 1 < _fsiends.Length) { index++; return true; } return false; } public void Reset()//重置到一开始位置 { index = -1; } }}//=================================================================使用yield生成一个"枚举器"namespace _06foreach循环2{ class Program { static void Main(string[] args) { #region 方法一 Person p = new Person(); foreach (var item in p.GetEachobj()) { Console.WriteLine(item); } #endregion Console.WriteLine("=================="); #region 方法二 Person2 p2 = new Person2(); foreach (var item in p2) { Console.WriteLine(item); } Console.ReadKey(); #endregion } } public class Person2 : IEnumerable { private string[] Friends = new string[] { "黄林", "许正龙", "彭德怀", "杨硕" }; public string Name { get; set; } public int Age { get; set; } public string Email { get; set; } //当你返回值是IEnumerator类型时,编译器帮我买生成了一个"枚举器"。即:一个实现了IEnumerator接口的类型。 public IEnumerator GetEnumerator() { for (int i = 0; i < Friends.Length; i++) { yield return Friends[i]; } } } public class Person { public IEnumerable GetEachobj() { for (int i = 0; i < Friends.Length; i++) { yield return Friends[i]; } } private string[] Friends = new string[] { "黄林", "许正龙", "彭德怀", "杨硕" }; public string Name { get; set; } public int Age { get; set; } public string Email { get; set; } }}

你有困难我帮忙,我住隔壁我姓王。----------------- 你隔壁的老王宣。

猜你喜欢

转载自blog.csdn.net/qq_27559331/article/details/52865874
今日推荐