使用foreach循环是有IEnumerator接口来实现的,IEnumerator即实现了迭代器,在foreach中如何迭代一个集合arrayList呢?

  1. 调用arrayLis.GetEnumberator(),返回一个IEnumberator引用。
  2. 调用所返回的Enumberator接口的MoveNext()方法。
  3. 如果MoveNext()返回true,就使用IEnumberator接口的Current属性获取对象的一个引用,用于foreach循环。
  4. 重复前面两步,知道MoveNext方法返回false为止,此时循环停止。

迭代器的实现例子:

class Program
{ public static void Main(string[] args)
{
foreach (string str in SimpleList())
{
Console.WriteLine(str);
}
Console.ReadKey();
}
public static IEnumerable SimpleList()
{
yield return "1";
yield return "2";
yield return "3";
}
}

这样我们就实现了一个最简单的迭代器。结果为:

 

下面给个复杂一点的例子,用迭代器实现返回素数:

public static void Main(string[] args)
{
Primes primesFrom2TO1000 = new Primes(2, 1000);
foreach (long i in primesFrom2TO1000)
{
Console.Write("{0}", i);
}
}
public class Primes
{
private long min;
private long max; public Primes()
: this(2, 200)
{ }
public Primes(long minimum, long maximum)
{
if (minimum < 2)
{
min = 2;
}
else
{
min = minimum;
}
max = maximum;
}
public System.Collections.IEnumerator GetEnumerator()//返回类型为一个迭代器
{
for (long possiblePrime = min; possiblePrime <= max; possiblePrime++)
{
bool isPrime = true;
for (long possibleFactor = 2; possibleFactor <= (long)Math.Floor(Math.Sqrt(possiblePrime)); possibleFactor++)
{
long remainderAfterDivsion = possiblePrime % possibleFactor;
if (remainderAfterDivsion == 0)
{
isPrime = false;
break;
}
}
if (isPrime)
{
yield return possiblePrime;//为素数,返回之
}
}
}
}

结果为:

 

迭代器返回的类型有两种:IEnumberable和IEnumerator。

  • 如果要迭代一个类,可使用GetEnumerator(),它的返回类型是IEnumerator。
  • 如果要迭代一个类成员,例如一个方法,则使用IEnumerable。

.NET基础之迭代器的更多相关文章

  1. (转)python基础之迭代器协议和生成器(一)

    一 递归和迭代 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...

  2. C++基础之迭代器iterator

    C++基础之迭代器iterator 我们已经知道可以使用下标运算符来访问string对象的字符或vector对象的元素,还有另一种更通用的机制也可以实现同样的目的,这就是迭代器(iterator). ...

  3. Day4 - Python基础4 迭代器、装饰器、软件开发规范

    Python之路,Day4 - Python基础4 (new版)   本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 ...

  4. Python基础之迭代器、生成器

    一.迭代器: 1.迭代:每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值.例如:循环获取容器中的元素. 2.可迭代对象(iterable): 1)定义:具有__ite ...

  5. Python 入门基础11 --函数基础4 迭代器、生成器、枚举类型

    今日目录: 1.迭代器 2.可迭代对象 3.迭代器对象 4.for循环迭代器 5.生成器 6.枚举对象 一.迭代器: 循环反馈的容器(集合类型) 每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的 ...

  6. python基础之迭代器、生成器、装饰器

    一.列表生成式 a = [0,1,2,3,4,5,6,7,8,9] b = [] for i in a: b.append(i+1) print(b) a = b print(a) --------- ...

  7. python基础之迭代器、装饰器、软件开发目录结构规范

    生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大 ...

  8. python基础知识---迭代器、生成器、装饰器

    一.迭代器 二.生成器 http://www.cnblogs.com/huxi/archive/2011/07/14/2106863.html def func(): #定义生成器,和普通函数的区别是 ...

  9. ES6 基础版迭代器

    ES6中引入了generator function* get() { var result1 = yield c; var result2 = yield b; var result3 = yield ...

  10. C++学习基础三——迭代器基础

    迭代器分为两种:一种是iterator,另一种是const_iterator.两者都可进行访问容器中的元素,不同之处是:(1)const_iterator类型只能用于读取容器内的元素,不能更改其值:而 ...

随机推荐

  1. ActiveXObject对象详解

    一.什么是 ActiveX 控件?         ActiveX 控件广泛用于 Internet.它们可以通过提供视频.动画内容等来增加浏览的乐趣.不过,这些程序可能出问题或者向您提供不需要的内容. ...

  2. java io文件学习笔记

    File f = new file("D:"+File.separator+"test.txt"); File.separator跨系统文件分隔符 f.crea ...

  3. [Javascript,JSON] JQuery处理json与ajax返回JSON实例

    转自:http://www.php100.com/html/program/jquery/2013/0905/5912.html [导读] json数据是一种经型的实时数据交互的数据存储方法,使用到最 ...

  4. Java 文件名操作的相关工具类

    项目中的操作文件名的工具类: import java.io.File; import java.util.regex.Matcher; import java.util.regex.Pattern; ...

  5. CXF(2.7.10) - RESTful Services

    1. 定义 JavaBean.注意 @XmlRootElement 注解,作用是将 JavaBean 映射成 XML 元素. package com.huey.demo.bean; import ja ...

  6. Jersey(1.19.1) - Client API, Ease of use and reusing JAX-RS artifacts

    Since a resource is represented as a Java type it makes it easy to configure, pass around and inject ...

  7. 获取登录的IP或者信息

    这是转载的,也不想去检查性能,对于这些成熟的代码,发在这里完全是懒,仅此而已! 1.获取客户端IP /// <summary> /// 获取客户端Ip /// </summary&g ...

  8. Android的ListView分页功能

    一.功能分析----ListView“加载更多”,功能如下图所示: 这个效果是当你上拉拖动页面时(注意有区别于下拉刷新),页面提示正在加载,2秒后显示留言更多内容:具体功能知道那我就来讲解下如何实现这 ...

  9. android 使用两个surfaceview 在摄像机画面上绘图

    转载自http://blog.csdn.net/jesse__zhong/article/details/24934083 使用双surface,将第一个设置为透明背景,在摄像机上绘制图像,纠结搞了一 ...

  10. ios获取当前语言

    上代码: + (NSString*)getPreferredLanguage { NSUserDefaults * defaults = [NSUserDefaults standardUserDef ...