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; 
      }

    http://www.cnblogs.com/hsapphire/archive/2010/04/16/1713211.html

  • 相关阅读:
    MySQL使用小记
    简单使用grunt、bower工具合并压缩js和css
    python爬虫scrapy命令工具学习之篇三
    python爬虫scrapy学习之篇二
    Maven简单的配置Junit测试及使用简单的mock
    mysql循环查询树状数据
    centos 升级python26到python27
    java基础之十一:方法重写
    java基础知识之十:final关键字
    java基础知识之九:继承
  • 原文地址:https://www.cnblogs.com/YoungPop-Chen/p/3358700.html
Copyright © 2011-2022 走看看