C#中可枚举类型详解

2019-12-30 18:12:21刘景俊

怎么使用呢:


   SimpleCollection<string> colletion = new SimpleCollection<string>(new string[] { "ranran", "Huaran" });
      IEnumerator<string> enumorator = colletion.GetEnumerator();
      while(enumorator.MoveNext())
      {
        Console.WriteLine(enumorator.Current);
      }
      foreach(var v in colletion)
      {
        Console.WriteLine(v);
      }
      Console.ReadKey();

还可以直接使用迭代器:
使用迭代器是另一种完全实现上面两个接口的方案,这是最为简便和可读的方法

而且使用迭代器可以很方便和快捷的设置各种枚举情况 如双重的迭代 反向的迭代 临时的集合和负责迭代等等 比上面的实现更为简单

迭代的关键字是yield 需要依靠一个迭代器块(注意是循环+yield  return,或者 yiled break)


 public class MyCollection:IEnumerable
  {
    private object[] array;
    public MyCollection(object []items)
    {
      array = items;
    }
    public IEnumerator GetEnumerator() //实现都可以依靠编译器去完成
    {
      //foreach (object v in array)
      //{
      //  yield return v;
      //}

      //关键字是yield 并不是foreach 我们也可以按照下面这个方法进行实现
      for(int i=0;i<array.Length;i++)
      {
        yield return array[i];
      }
      //当然其它的while循环也可以。。
    }
  }
//实现:
MyCollection collection = new MyCollection(new object[] { 1, 2, 3 });
      foreach(var v in collection)
      {
        Console.WriteLine(v);
      }

可以自己设置迭代的情况:

 


   public class MyCollection2:IEnumerable
  {
     private object[] array;
     public MyCollection2(object []items)
    {
      array = items;
    }
    //可以在迭代器块中设置迭代的实现情况 即具体迭代多少个元素
    //比如我们只想迭代4个元素
    public IEnumerator GetEnumerator()
     {
       int count = 0;//设计一个标记位
      foreach(object item in array)
      {
        ++count;
        yield return item;
        if (count == 4) yield break; //break关键字 退出迭代 实际上迭代在实现当中就是一个循环 利用break跳出也合情合理
      }
     }
   
  }


//////
 MyCollection2 collection2 = new MyCollection2(new object[]{4,5,6,7,8});
      //它就只会输出4,5,6,7
      foreach (var v in collection2)
      {
        Console.WriteLine(v);
      }

双重迭代:


 /// <summary>
  /// 下面演示双重迭代 即一次可以迭代两个集合中的元素
  /// </summary>
  public class MyColletion3:IEnumerable
  {
    private object[] List1;
    public string[] List2;
    public MyColletion3(object []items1,string []items2)
    {
      this.List1 = items1;
      this.List2 = items2;
    }
    //下面进行双重迭代
    public IEnumerator GetEnumerator()
    {
      //关键代码
      for(int index=0;index<(List1.Length>List2.Length?List2.Length:List1.Length);index++)
      {
        yield return List1[index];
        yield return List2[index];
      }
    }
  }
////////
 MyColletion3 collection3 = new MyColletion3(new object[] { 1, 2, 3, 5.5 }, new string[] { "RanRan", "Chengdu", "四川" });
      foreach(var v in collection3)
      {
        Console.WriteLine(v);
      }
      //迭代结果是1 RanRan 2 Chengdu 3 四川