在平常的代码编写中,虽然不常用到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){...}

  • 2006年02月(5)

数据源转成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;
  }

转载于:https://www.cnblogs.com/hsapphire/archive/2010/04/16/1713211.html

IEnumerable相关推荐

  1. (1)学习数组,集合,IEnumerable接口,引申学习迭代器

    发展:数组-->集合-->泛型 (1)数组 1. 数组数据结构是System.Array类的一个实例. 2. System.Array类的语法为 [SerializableAttribut ...

  2. 理解 IEnumerable 与 IEnumerator

    我们在编码中,经常使用foreach遍历集合,能够遍历的集合必定实现了 IEnumerator接口,IEnumerator接口如下: 1 public interface IEnumerator 2 ...

  3. Hawk原理:通过IEnumerable实现通用的ETL管道

    针对IEnumerable已经有多篇文章,本篇介绍如何使用IEnumerable实现ETL. ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过萃取(ex ...

  4. IEnumerable和IQueryable在使用时的区别

    最近在调研数据库查询时因使用IEnumerable进行Linq to entity的操作,造成数据库访问缓慢.此文讲述的便是IEnumerable和IQueryable的区别. 微软对IEnumera ...

  5. C# IEnumerable和IEnumerator的区别,如何实现

    IEnumerable接口和IEnumerator接口是.NET中非常重要的接口,二者有何区别? 1. 简单来说IEnumerable是一个声明式的接口,声明实现该接口的类就是"可迭代的en ...

  6. Entity Framework返回IEnumerable还是IQueryable?

    在使用EF的过程中,我们常常使用repository模式,本文就在repository层的返回值是IEnumerable类型还是IQueryable进行探讨. 阅读目录: 一.什么是Repositor ...

  7. 关于迭代器中IEnumerable与IEnumerator的区别

    首先是IEnumerable与IEnumerator的定义: 1.IEnumerable接口允许使用foreach循环,包含GetEnumerator()方法,可以迭代集合中的项. 2.IEnumer ...

  8. Entity Framework中IQueryable, IEnumerable, IList的区别

    使用工具追踪EF生成的SQL 使用Entity Framework等ORM框架的时候,SQL对于使用者来说是透明的,往往很多人也不关心ORM所生成的SQL,然而系统出现性能问题的时候就必须关注生成的S ...

  9. IEnumerable是否应该实现IEnumerable接口

    C#2.0的遍历器(Iterator),应该是对Gamma提出的Iterator设计模式的实现.在C#中,如果某个类型继承了接口IEnumerable,或者继承了泛型接口IEnumerable < ...

  10. IEnumerable和IEnumerator 详解

    IEnumerable接口是非常的简单,只包含一个抽象的方法GetEnumerator(),它返回一个可用于循环访问集合的IEnumerator对象.IEnumerator对象有什么呢?它是一个真正的 ...

最新文章

  1. postman 获取session_【接口测试】Postman入门10 Postman中的Session
  2. 北京智能计算产业研究院成立
  3. 在选择数据库的路上,我们遇到过哪些坑?(1)
  4. 计算机高效课堂建设,打造职业学校计算机高效课堂.doc
  5. 复利计算--结对1.0,做汉堡,结对2.0
  6. Leetcode--7. 整数反转
  7. python中对文件进行读和写
  8. 计算机 未来哪种技术稀缺,2015级职业生涯规划考试试题
  9. IOS13图标尺寸_苹果iOS 13特性大猜想:新增黑暗模式、多窗口应用、手势导航
  10. P2515 [HAOI2010]软件安装
  11. 已经被删除的PDF怎么用EasyRecovery恢复
  12. Lesson 73-74 The quality of our lives
  13. pb9 调用系统语音_语音通知解决方案,VIKI语音通知软件介绍
  14. Mac如何用Boot Camp安装Windows 11?告诉你如何安装 能不能安装!
  15. python :alpha shapes 算法检测边界点
  16. 免费录屏软件Captura下载安装及分享
  17. 子选择器和后代选择器
  18. 「滑板+EdgeBoard 竟能搭出AI质检流水线?」“软件杯”全国一等奖团队参赛心得...
  19. 动态规划问题 -- 求给定K个币种时N美元有几种组合方式 (例1,2,3美元存在,求10美元有几种组合方式)
  20. 性能优化之MySQL优化(转)

热门文章

  1. Spring Boot文档阅读笔记-how-to-implement-2-way-ssl-using-spring-boot
  2. Qt文档阅读笔记-对JSON Save Game官方实例解析
  3. Spring Boot笔记-使用RestTemplate优雅的调用百度ORC接口
  4. Qt笔记-QxOrm基本使用(对SQLLite进行增删改查)
  5. Python笔记-Flask的搭建及基本使用
  6. SQL工作笔记-达梦数据库关于时间的函数
  7. 软考系统架构师笔记-案例分析重点(二)
  8. 系统架构师学习笔记-操作系统(二)
  9. python输入的数字为什么不能计算_计算器为什么只能进行个位数的计算,每次只能输入一个数字,求...
  10. 面试题目_数据分析SQL面试题目9套汇总