zoukankan      html  css  js  c++  java
  • ICollection IEnumerable/IEnumerator IDictionaryEnumerator yield

    Enumerable和IEnumerator接口是.NET中非常重要的接口,二者区别:

    1. IEnumerable是个声明式的接口,声明实现该接口的类就是“可迭代的enumerable”,但并没用说明如何实现迭代器(iterator).其代码实现为:

        public interface IEnumerable
         {
              IEnumerator GetEnumerator();
         }
    2. IEnumerator是个实现式接口,它声明实现该接口的类就可以作为一个迭代器iterator.其代码实现为:

        public interface IEnumerator
        {
             object Current { get; }

             bool MoveNext();
             void Reset();
        }

    3.一个collections要支持Foreach进行遍历,就必须实现IEnumerable,并一某种方式返回迭代器对象:IEnumerator.

    static void Main(string[] args)
    {
      #region ICollection(CopyTo方法) IEnumerator(支持所有一般非泛型集合) IDictionaryEnuerator(HashTable/SortList支持一般非泛型键值对集合)

      //集群枚举器:可以概念上认为复制了原始集群中的内容

      Console.WriteLine("------------ 1 ArrayList-----------------");

      #region ArrayList:IEnumerator

      ArrayList al = new ArrayList() { 1, 2, 3, 4 };
      IEnumerator iEnum = al.GetEnumerator();

      IEnumerable alIEnumerable = (IEnumerable)al.GetEnumerator();
      foreach (var item in alIEnumerable)
      {
        Console.WriteLine(string.Format("IEnumerable{0} = {1}",item.ToString(),item.ToString()));
      }

      while (iEnum.MoveNext())
      {
        Console.WriteLine(string.Format("IEnumerator{0} = {1}",iEnum.Current,iEnum.Current));
      }

      #endregion

      Console.WriteLine();
      Console.WriteLine("------------ 2 SortedList-----------------");

      #region SortedList:IEnumerator/IDictionaryEnumerator

      SortedList sl = new SortedList();
      sl.Add(1, 1);
      sl.Add(2, 2);
      sl.Add(3, 3);
      IEnumerator slIEnum = sl.GetEnumerator();
      while (slIEnum.MoveNext())
      {
        DictionaryEntry slDE = (DictionaryEntry)slIEnum.Current;
        Console.WriteLine(string.Format("slIEnum{0} = {1}", slDE.Key, slDE.Value));
      }

      Console.WriteLine("-------------------------------------");

      IDictionaryEnumerator slIDicEnum = sl.GetEnumerator();
      while (slIDicEnum.MoveNext())
      {
        Console.WriteLine(string.Format("slIDicEnum{0} = {1}", slIDicEnum.Key, slIDicEnum.Value));
      }

      #endregion

      Console.WriteLine();
      Console.WriteLine("------------ 3 Hashtable-----------------");

      #region Hashtable:IEnumerator/IDictionaryEnumerator

      Hashtable ht = new Hashtable();
      ht.Add(1,1);
      ht.Add(2,2);
      ht.Add(3, 3);
      IEnumerator htIEnum = ht.GetEnumerator();
      while (htIEnum.MoveNext())
      {
        DictionaryEntry de = (DictionaryEntry)htIEnum.Current;

        Console.WriteLine(string.Format("htKeyIEnum{0} = {1},htValueIEnum{2} = {3}", de.Key, de.Key, de.Value, de.Value));
      }

      Console.WriteLine("-------------------------------------");

      IDictionaryEnumerator htIDicEnum = ht.GetEnumerator();
      while (htIDicEnum.MoveNext())
      {
        Console.WriteLine(string.Format("htIDicEnumKey{0} = {1},htIDicEnumValue{2} = {3}", htIDicEnum.Key, htIDicEnum.Key, htIDicEnum.Value,     htIDicEnum.Value));
      }

      #endregion

      Console.WriteLine();
      Console.WriteLine("------------ 4 ICollection---------------");

      #region ICollection:从指定的System.Array索引处,将System.Collections.ICollection的元素复制到System.Array中

      ICollection icKey = ht.Keys;
      ICollection icValue = ht.Values;

      int[] intKey = new int[icKey.Count];
      int[] intValue = new int[icValue.Count];

      //从指定的System.Array索引处,将System.Collections.ICollection的元素复制到System.Array中
      icKey.CopyTo(intKey, 0);
      icValue.CopyTo(intValue, 0);

      foreach (int i in intKey)
      {
        Console.WriteLine(string.Format("intKey[{0}]= {1}", i, i));
      }

      Console.WriteLine("-------------------------------------");

      foreach (int i in icValue)
      {
        Console.WriteLine(string.Format("intValue[{0}]= {1}", i, i));
      }

      #endregion

      #region IEnumerable

      foreach (int i in ShowIEnumerable(2, 8))
      {
        Console.WriteLine(i);
      }

      #endregion

      #endregion

      Console.ReadKey();
    }

    /// <summary>
    /// yield:在迭代器块中用于向枚举数对象提供值或发出迭代结束信号。
    /// 它的形式为下列之一:
    /// 1)yield return <expression>;
    /// 2)yield break;
    /// 计算表达式并以枚举数对象值的形式返回;expression 必须可以隐式转换为迭代器的 yield 类型。
    /// yield 语句只能出现在 iterator 块中,该块可用作方法、运算符或访问器的体。这类方法、运算符或访问器的体受以下约束的控制:
    /// 1)不允许不安全块。
    /// 2)方法、运算符或访问器的参数不能是 ref 或 out
    /// 此外:
    /// 1)yield 语句不能出现在匿名方法中
    /// 2)当和 expression 一起使用时,yield return 语句不能出现在 catch 块中或含有一个或多个 catch 子句的 try 块中
    /// </summary>
    /// <param name="num1"></param>
    /// <param name="num2"></param>
    /// <returns></returns>

    public static IEnumerable ShowIEnumerable(int num1, int num2)
    {
      int num3 = 0;
      int result = 1;
      while (num3++ < num2)
      {
        result = result * num1;
        yield return result;
      }
    }

  • 相关阅读:
    小程序实现无限瀑布流
    Vue H5 项目模板
    Taro使用mobx做国际化小程序
    一次国际化记录以及平铺JSON数据
    Promise(interesting)
    返回状态码
    CSS属性兼容写法
    在DOM加载之前insertScript
    关于吸烟
    前端优化措施
  • 原文地址:https://www.cnblogs.com/jack-Leo/p/6343633.html
Copyright © 2011-2022 走看看