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){...}
- 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)学习数组,集合,IEnumerable接口,引申学习迭代器
发展:数组-->集合-->泛型 (1)数组 1. 数组数据结构是System.Array类的一个实例. 2. System.Array类的语法为 [SerializableAttribut ...
- 理解 IEnumerable 与 IEnumerator
我们在编码中,经常使用foreach遍历集合,能够遍历的集合必定实现了 IEnumerator接口,IEnumerator接口如下: 1 public interface IEnumerator 2 ...
- Hawk原理:通过IEnumerable实现通用的ETL管道
针对IEnumerable已经有多篇文章,本篇介绍如何使用IEnumerable实现ETL. ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过萃取(ex ...
- IEnumerable和IQueryable在使用时的区别
最近在调研数据库查询时因使用IEnumerable进行Linq to entity的操作,造成数据库访问缓慢.此文讲述的便是IEnumerable和IQueryable的区别. 微软对IEnumera ...
- C# IEnumerable和IEnumerator的区别,如何实现
IEnumerable接口和IEnumerator接口是.NET中非常重要的接口,二者有何区别? 1. 简单来说IEnumerable是一个声明式的接口,声明实现该接口的类就是"可迭代的en ...
- Entity Framework返回IEnumerable还是IQueryable?
在使用EF的过程中,我们常常使用repository模式,本文就在repository层的返回值是IEnumerable类型还是IQueryable进行探讨. 阅读目录: 一.什么是Repositor ...
- 关于迭代器中IEnumerable与IEnumerator的区别
首先是IEnumerable与IEnumerator的定义: 1.IEnumerable接口允许使用foreach循环,包含GetEnumerator()方法,可以迭代集合中的项. 2.IEnumer ...
- Entity Framework中IQueryable, IEnumerable, IList的区别
使用工具追踪EF生成的SQL 使用Entity Framework等ORM框架的时候,SQL对于使用者来说是透明的,往往很多人也不关心ORM所生成的SQL,然而系统出现性能问题的时候就必须关注生成的S ...
- IEnumerable是否应该实现IEnumerable接口
C#2.0的遍历器(Iterator),应该是对Gamma提出的Iterator设计模式的实现.在C#中,如果某个类型继承了接口IEnumerable,或者继承了泛型接口IEnumerable < ...
- IEnumerable和IEnumerator 详解
IEnumerable接口是非常的简单,只包含一个抽象的方法GetEnumerator(),它返回一个可用于循环访问集合的IEnumerator对象.IEnumerator对象有什么呢?它是一个真正的 ...
最新文章
- postman 获取session_【接口测试】Postman入门10 Postman中的Session
- 北京智能计算产业研究院成立
- 在选择数据库的路上,我们遇到过哪些坑?(1)
- 计算机高效课堂建设,打造职业学校计算机高效课堂.doc
- 复利计算--结对1.0,做汉堡,结对2.0
- Leetcode--7. 整数反转
- python中对文件进行读和写
- 计算机 未来哪种技术稀缺,2015级职业生涯规划考试试题
- IOS13图标尺寸_苹果iOS 13特性大猜想:新增黑暗模式、多窗口应用、手势导航
- P2515 [HAOI2010]软件安装
- 已经被删除的PDF怎么用EasyRecovery恢复
- Lesson 73-74 The quality of our lives
- pb9 调用系统语音_语音通知解决方案,VIKI语音通知软件介绍
- Mac如何用Boot Camp安装Windows 11?告诉你如何安装 能不能安装!
- python :alpha shapes 算法检测边界点
- 免费录屏软件Captura下载安装及分享
- 子选择器和后代选择器
- 「滑板+EdgeBoard 竟能搭出AI质检流水线?」“软件杯”全国一等奖团队参赛心得...
- 动态规划问题 -- 求给定K个币种时N美元有几种组合方式 (例1,2,3美元存在,求10美元有几种组合方式)
- 性能优化之MySQL优化(转)
热门文章
- Spring Boot文档阅读笔记-how-to-implement-2-way-ssl-using-spring-boot
- Qt文档阅读笔记-对JSON Save Game官方实例解析
- Spring Boot笔记-使用RestTemplate优雅的调用百度ORC接口
- Qt笔记-QxOrm基本使用(对SQLLite进行增删改查)
- Python笔记-Flask的搭建及基本使用
- SQL工作笔记-达梦数据库关于时间的函数
- 软考系统架构师笔记-案例分析重点(二)
- 系统架构师学习笔记-操作系统(二)
- python输入的数字为什么不能计算_计算器为什么只能进行个位数的计算,每次只能输入一个数字,求...
- 面试题目_数据分析SQL面试题目9套汇总