使用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. Message Decoding

    Some message encoding schemes require that an encoded message be sent in two parts. The first part, ...

  2. I2C驱动程序

    i2c_add_driver i2c_register_driver driver->driver.bus = &i2c_bus_type; driver_register(&d ...

  3. InvocationTargetException

    在使用反射的适合,调用的方法无论抛出什么异常,都会变成InvocationTargetException,要想得到原始的异常,必须使用getTargetException()

  4. HTML5 indexedDB数据库的入门学习(一)

    笔者早些时间看过web sql database,但是不再维护和支持,所以最近初步学习了一下indexedDB数据库,首先indexedDB(简称IDB)和web sql database有很大的差别 ...

  5. [改善Java代码]让多重继承成为现实

    建议41: 让多重继承成为现实 在Java中一个类可以多重实现,但不能多重继承,也就是说一个类能够同时实现多个接口,但不能同时继承多个类.但有时候我们确实需要继承多个类,比如希望拥有两个类的行为功能, ...

  6. 关于网络连接方式的总结(HostOnly,NAT....)

    真实的网络结构: 最左侧的电脑左侧的线代表,如果这台电脑有网卡的话可以去连接别的电脑. 在一台Windows中用VMware来安装一个Linux系统(用虚线的都代表不是真实的) 上图中的虚拟网关在哪里 ...

  7. zoj 2676 网络流+01分数规划

    思路: 这题的结论得要看amber的论文,结论就是将求f(x)/b(x)最小转化为求min(f(x)-b(x)*λ),其中x为S集的解空间,f(x)为解的边权和,b(x)为解的边数, λ=f(x)/b ...

  8. saltstack实战4--综合练习4

    Saltstack配置管理-给minion增加Zabbix-agent zabbix-agent的包 [root@A ~]# rpm -qa |grep zabbix zabbix-2.4.8-1.e ...

  9. MyBatis(3.2.3) - Configuring MyBatis using XML, typeHandlers

    As discussed in the previous chapter, MyBatis simplifies the persistent logic implementation by abst ...

  10. Linux 命令 - ls: 列出目录内容

    ls 命令很可能是用户最常使用的命令,通过 ls 命名可以查看目录内容,确定各种重要文件和目录的属性. 命令格式 ls [OPTION]... [FILE]... 命令参数 -a, --all 列出所 ...