关于C#迭代器
>1 IEnumerator与IEnumerable
IEnumerator与IEnumerable两个接口是用于实现迭代器的接品只要实现了IEnumerable就可以用foreach,linq等语法,一般来说实现 IEnumerable接口的是Collection的数据,也就是一个集合,比如List,ArrayList等这种类型,因为一般foreach,linq都是在一个集合中查询
而IEnumerator主要是支持IEnumerator一个接口,里面提供了用于迭代的属 性和方法,两个接口代码
public interface IEnumerable{
IEnumerator GetEnumerator();
}
public interface IEnumerable{
object Current{get;}
bool MoveNext();
void Reset();
}
下面是简单实现自己类支持迭代
public class Man
{
public string Name { get; set; }
public int Age { get; set; } public override string ToString()
{
return string.Format("{0} {1}", Name, Age);
}
} public class ManEnum : IEnumerator
{ private Man[] man;
private int index = -; public ManEnum(Man[] man)
{
this.man = man;
} public object Current
{
get { return man[index]; }
} public bool MoveNext()
{
index++;
return index < man.Length;
} public void Reset()
{
index = -;
}
} public class ManCollection : IEnumerable
{
private ManEnum me; public ManCollection(Man[] man)
{
this.me = new ManEnum(man);
} public IEnumerator GetEnumerator()
{
return me;
}
}
下面测试可以用foreach打印信息出来
Man[] man = { new Man() { Name = "小明", Age = },
new Man() { Name = "小红", Age = } };
ManCollection mc = new ManCollection(man);
foreach (var m in mc) {
Console.WriteLine(m);
}
>2 yield我们可以用yield更方便快捷的写出迭代器,可以实现返回IEnumerable或 IEnumerator的对象
下面是用yield修改的代码,我们可以直接去掉ManEnum类.把ManCollection 改一下
public class ManCollection : IEnumerable
{
private Man[] mans; public ManCollection(Man[] man)
{
this.mans = man;
} public IEnumerator GetEnumerator()
{
for (int i = ; i < mans.Length; i++)
{
yield return mans[i];
}
}
}
这次我们用linq来查询出年龄大于等于18岁的.
Man[] man = { new Man() { Name = "小明", Age = },
new Man() { Name = "小红", Age = } };
ManCollection mc = new ManCollection(man);
var q = from r in man
where r.Age >=
select r;
foreach (var x in q) {
Console.WriteLine(x);
}
可以看出没有问题,yield还有一种就是yield break;可以在迭代过程中打段
,类似于循环中break一样的效果.
关于C#迭代器的更多相关文章
- 匹夫细说C#:庖丁解牛迭代器,那些藏在幕后的秘密
0x00 前言 在匹夫的上一篇文章<匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置>的最后,匹夫以总结和后记的方式涉及到一部分迭代器的知识.但是觉得还是不够过瘾,很多需要说清楚 ...
- 轻量级“集合”迭代器-Generator
Generator是PHP 5.5加入的新语言特性.但是,它似乎并没有被很多PHP开发者广泛采用.因此,在我们了解PHP 7对Generator的改进之前,我们先通过一个简单却显而易见的例子来了解下G ...
- C#设计模式-迭代器模式
一. 迭代器(Iterator)模式 迭代器是针对集合对象而生的,对于集合对象而言,必然涉及到集合元素的添加删除操作,同时也肯定支持遍历集合元素的操作,我们此时可以把遍历操作也放在集合对象中,但这样的 ...
- 设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)
上篇博客我们从醋溜土豆丝与清炒苦瓜中认识了“模板方法模式”,那么在今天这篇博客中我们要从电影院中来认识"迭代器模式"(Iterator Pattern).“迭代器模式”顾名思义就是 ...
- Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化
本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...
- 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。
最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...
- Java迭代器
迭代器在其实就是指针,读取集合或者数组中的一个值,读完以后又指向下一条数据. iterator() 迭代器只读,不能改效率要比for循环高 迭代器的一些方法: HasNext() 如果仍有元素可以迭代 ...
- Python 生成器与迭代器 yield 案例分析
前几天刚开始看 Python ,后因为项目突然到来,导致Python的学习搁置了几天.然后今天看回Python 发现 Yield 这个忽然想不起是干嘛用的了(所以,好记性不如烂笔头.).然后只能 花点 ...
- 设计模式02迭代器(java)
先贴代码,有空来写内容. 1.定义集合 import java.util.List; import java.util.ArrayList; //coollection是我自己定义的一个集合,因为要写 ...
- JAVA编程思想(第四版)学习笔记----11.5 List,11.6迭代器
Collection类的层次结构图(来源与网络)如下所示: 接口:Iterator<T> public interface Iterable<T> Iterable<T& ...
随机推荐
- CG基础教程-陈惟老师十二讲笔记
转自 麽洋TinyOcean:http://www.douban.com/people/Tinyocean/notes?start=50&type=note 因为看了陈惟十二讲视频没有课件,边 ...
- 在Spring中使用脚本
Spring支持3中不同的脚本语言(看来支持地还挺多的嘛):JRuby.Groovy和BeanShell. 这三个都是java社区的脚本语言(反正到目前为止我一个都没用过,可见我有多挫). JRuby ...
- windows上配置git
windows上配置git1.下载mysisigit进入http://msysgit.github.io/,下载,安装,下一步下一步即可. 2.下载tortoisegit进入http://downlo ...
- TCP协议中的三次握手和四次挥手(图解) 转载
建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...
- [转载] 为 Key-Value 数据库实现 MVCC 事务
http://mp.weixin.qq.com/s?__biz=MzA5ODM5MDU3MA==&mid=400086920&idx=1&sn=b8174184059e2886 ...
- fragment入门
[1]在activity布局中定义fragment <?xml version="1.0" encoding="utf-8"?> <Linea ...
- 关于图片加载非常爽的一个三方控件 fresco,一个三fresco
Hi EveryBody 今天来玩一个非常爽的控件 fresco 到底有多爽呢 接着看就知道了 首先 来看看fresco 是个神马东西 https://github.com/facebook/fre ...
- oracle中修改表名
<<<备忘>>> answer1: ALTER TABLE old_table_name RENAME TO new_table_name;(大写为系统命令) ...
- python模块以及导入出现ImportError: No module named 'xxx'问题
python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包.只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用如果你要使 ...
- ORA-00205
场景 数据库启动时报错.关闭前还是正常运行的,再次启动时,就报了以下错误. Copyright (c) , , Oracle. All rights reserved. Connected to an ...