zoukankan      html  css  js  c++  java
  • IEnumerable

    在平常的代码编写中,虽然不常用到Ienumerable 但却不可不知他的意义,有些时候使用会起到意想不到的作用,

    我们从中可以知道 foreach 在IL中,是以Ienumberable 来体现的。

    IEnumerable和IEnumerable
       主要实现  public IEnumerator GetEnumerator()
    C# 1.0中的foreach

    没有迭代器的时候,创建一个可用于foreach的集合(C# 1.0):

    public class MyCollection : IEnumerable
    {
      public MyEnumerator GetEnumerator()
      {
       return new MyEnumerator(this);
      }
      public class MyEnumerator : IEnumerator
      {
       public void Reset(){...}
       public bool MoveNext(){...}
       public int Current{ get{...} }
       object IEnumerator.Current{ get{...} }
      }
    }

    对集合使用foreach语句:
      foreach(int i in col){...}

    相单于:
    IEnumerator etor = ((IEnumerable)col).GetEnumerator();
    try
    {
      while(etor.MoveNext())
      {
       ElementType clem (ElementType)etor.Current;
       ...;
      }
    }
    finally{(IDisposable)enumerator).Dispose();}

    C# 2.0 中的迭代器

    使用迭代器创建于foreach的集合(C# 2.0):

    public class Stack:IEnumerable
    {
      T[] items;
      int count;
      public void Push(T data){...}
      public T Pop(){...}
      public IEnumerator GetEnumerator()
      {
       for(int i=count-1;i>=0;--i)
       {
         yield return items[i];
       }
      }
    }

    使用foreach语句:

    Stack stack = new Stack();
    foreach(int i in statck){...}

    数据源转成IEnumerable类型

    //将数据源中的数据都转换为IEnumerable类型,用作数据绑定

    //其中_dataSource为数据源,DataMember为要找的数据名称

      protected virtual IEnumerable GetDataSource()
      {
       if(_dataSource == null)
       {
        return null;
       }
       IEnumerable resolvedDataSource = _dataSource as IEnumerable;
       if(resolvedDataSource != null)
       {
        return resolvedDataSource;
       }

       IListSource listSource = _dataSource as IListSource;
       if(listSource != null)
       {
        IList memberList = listSource.GetList();
        int i = memberList.Count;
        if(listSource.ContainsListCollection == false)
        {
         return (IEnumerable)memberList;
        }

        ITypedList typedMemberList = memberList as ITypedList;
        if(typedMemberList != null)
        {
         PropertyDescriptorCollection propDescs = typedMemberList.GetItemProperties(new PropertyDescriptor[0]);
         PropertyDescriptor memberProperty = null;
         if((propDescs != null) && (propDescs.Count!=0))
         {
          string dataMember = DataMember;
          if(dataMember.Length == 0)
          {
           memberProperty = propDescs[0];
          }
          else
          {
           memberProperty = propDescs.Find(dataMember,true);
          }

          if(memberProperty != null)
          {
           object listRow = memberList[0];
           object list = memberProperty.GetValue(listRow);

           if(list is IEnumerable)
           {
            return (IEnumerable)list;
           }
          }
          throw new Exception("no Datamember.");
         }
         throw new Exception("no datamember.");
        }
       }
       return null;
      }

  • 相关阅读:
    一个配置引发的血案
    软件工程之学习方法篇
    开篇
    重拾《 两周自制脚本语言 》- 中文关键字与原生函数
    重拾《 两周自制脚本语言 》- 支持中文标识符
    将《 两周自制脚本语言 》测试中使用的接口中文化
    5分钟入门LingaScript-尝鲜中文版TypeScript
    为《 两周自制脚本语言 》添加中文测试代码
    2019-02-18 扩展Python控制台实现中文反馈信息之二-正则替换
    2019-02-14 1992年日本对母语编程的可读性比较实验
  • 原文地址:https://www.cnblogs.com/hsapphire/p/1713211.html
Copyright © 2011-2022 走看看