首先是IEnumerable与IEnumerator的定义:

1.IEnumerable接口允许使用foreach循环,包含GetEnumerator()方法,可以迭代集合中的项。

2.IEnumerator接口是一个真正的集合访问器,它包含MoveNext()方法和Current属性,在foreach循环中,如果MoveNext()返回True,则就是用IEnumerator接口的Current属性来获取对象的一个引用,用于foreach循环。

3.如果要迭代一个类,可以使用GetEnumerator(),其返回类型是IEnumerator.

 如果要迭代一个类成员,则用IEnumerable.

下面的例子是迭代Person类中的类成员Ages,使用了IEnumerable。第二个例子则是迭代一个类,所以使用了IEnumerator作为返回值。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;namespace _10_5_5
{public class person{private string name;private int age;public string Name{get{return name;}set{name = value;}}public int Age{get{return age;}set{age = value;}}public person(string PName, int PAge){Name = PName;Age = PAge;}public static bool operator >(person a, person b){if (a.Age > b.Age)return true;elsereturn false;}public static bool operator <(person a, person b){if (a.Age > b.Age)return false;elsereturn true;}public static bool operator >=(person a, person b){if (a.Age >= b.Age){return true;}elsereturn false;}public static bool operator <=(person a, person b){if (a.Age <= b.Age)return true;elsereturn false;}}public class People : DictionaryBase{public IEnumerable Ages//注意是IEnumerable{get{foreach (object person in Dictionary.Values){yield return (person as person).Age;}}}public person[] GetOldest(){People oldPeople = new People();person oldPerson = null;person currentPerson;foreach (DictionaryEntry myPeople in Dictionary){currentPerson = myPeople.Value as person;if (oldPerson == null){oldPerson = currentPerson;oldPeople.Add(oldPerson);}else{if (currentPerson > oldPerson){oldPeople.Clear();oldPeople.Add(currentPerson);oldPerson = currentPerson;}else{if (currentPerson >= oldPerson){oldPeople.Add(currentPerson);}}}}person[] oldestPeopleArray = new person[oldPeople.Count];int copyIndex = 0;foreach (DictionaryEntry p in oldPeople){oldestPeopleArray[copyIndex] = p.Value as person;copyIndex++;}return oldestPeopleArray;}public void Add(person p){Dictionary.Add(p.Name, p);}public person this[string SName]{get{return (person)Dictionary[SName];}set{Dictionary[SName] = value;}}}class Program{static void Main(string[] args){person a = new person("Jack", 11);person b = new person("Json", 10);People s = new People();s.Add(a);s.Add(b);foreach(int age in s.Ages){Console.WriteLine("{0}\t", age);}Console.ReadKey();}}
}

下面是自定义的一个迭代器的例子:

Primer.CS

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Ch11Ex03_Exam
{public class Primes{private long min;private long max;public Primes():this(2,100){}public Primes(long minNum,long maxNum){if(minNum<2){min=2;}else{min = minNum;}max = maxNum;}public IEnumerator GetEnumerator()//返回的是IEnumerator{for(long i=min;i<max;i++){int flag = 1;for(long j=2;j<Math.Sqrt(min);j++){if(i%j==0){flag = 0;break;}}if(flag==1){yield return i;}}}}
}

Program.CS:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Ch11Ex03_Exam
{class Program{static void Main(string[] args){Primes s = new Primes(2, 100);foreach(long i in s){Console.WriteLine("{0}\t", i);}Console.ReadKey();}}
}

转载于:https://www.cnblogs.com/JsonZhangAA/p/5372292.html

关于迭代器中IEnumerable与IEnumerator的区别相关推荐

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

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

  2. C#知识点总结系列:2、C#中IDisposable和IEnumerable、IEnumerator

    C#中如何合理的释放非托管内存?在本文中我们将讲解使用IDisposable释放托管内存和非托管内存. A.首先需要让类实现IDisposable接口,然后实现IDispose方法. A.a核心Dis ...

  3. IEnumerable和IEnumerator 详解

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

  4. IEnumerable和IQueryable的区别以及背后的ExpressionTree表达式树

    关于IEnumerable和IQueryable的区别,这事还要从泛型委托Func<T>说起.来看一个简单的泛型委托例子: class Program { static void Main ...

  5. java iter是否存在_Java中ListIterator和Iterator的区别以及ListIterator的应用

    Java中ListIterator和Iterator详解与辨析 在使用java集合的时候,都需要使用Iterator.但是java集合中还有一个迭代器ListIterator,在使用List.Arra ...

  6. [转]那些年我还不懂:IList,ICollection,IEnumerable,IEnumerator,IQueryable

    1.首先看一个简单的例子 int[] myArray = { 1, 32, 43, 343 };IEnumerator myie = myArray.GetEnumerator();myie.Rese ...

  7. python中的return和print的区别_python中return和print的区别(详细)

    Huskiesir python最近正在研究.今天,我面临一个问题,那就是,返回和印刷的区别.双方都能输出结果.的区别是什么?闲话少说,看下面的例子.# Code1: def break_words( ...

  8. IEnumerable和IEnumerator详解

    引言 IEnumerable是可枚举的所有非泛型集合的基接口, IEnumerable包含一个方法GetEnumerator(),该方法返回一个IEnumerator:IEnumerator提供通过C ...

  9. Spark中foreachPartition和mapPartitions的区别

    Spark中foreachPartition和mapPartitions的区别 spark的运算操作有两种类型:分别是Transformation和Action,区别如下: Transformatio ...

最新文章

  1. python实现选择排序
  2. 移动端分步注册_移动应用程序的可用性测试:分步指南
  3. mysql备份至cos_宝塔面板网站文件/数据库定时同步备份至腾讯云COS设置
  4. 智能一代云平台(九):EclipseLink返回Object转为实体的分析
  5. 从BMW Vision iNEXT 看宝马如何进军自动驾驶 1
  6. 设计模式C++实现--Factory模式
  7. 智能合约的形式化描述、分析和验证
  8. 文本转成图片(自动换行、自定义字体),图片抗锯齿优化,图片压缩优化
  9. 创翼linux版本,创翼电信客户端for Mac-创翼客户端Mac版下载 V1.3.7-PC6苹果网
  10. 田刚:庞加莱猜想与几何
  11. android 摄像头黑屏,5+app 安卓调用摄像头黑屏 苹果可以
  12. Python自动化爬取天眼查数据
  13. uniapp中使用svga动画
  14. R语言使用lm函数构建简单线性回归模型(建立线性回归模型)、拟合回归直线、使用attributes函数查看线性回归模型的属性信息、获取模型拟合对应的残差值residuals
  15. 手风琴 html 左边,Layui手风琴左边的符号如何修改
  16. 3ds Max发生闪退怎么办?
  17. 用MySQL模拟消息队列
  18. 原来Python自带了数据库,用起来真方便
  19. C语言运算符优先级及结合性
  20. ssm+jsp计算机毕业设计CheatEngine学习系统4i3k0(程序+LW+源码+远程部署)

热门文章

  1. java override格式_Lambda表达式告别@override
  2. mysql 连接 分组_详解MySQL中的分组查询与连接查询语句
  3. mysql配置文件构成以及具体的配置demo
  4. Java项目实训报告
  5. 【吐血整理】用java编写一个登陆界面
  6. CyberDuck:Macos和Linux服务器简洁传大文件
  7. 对于插入和删除数据越频繁的操作 ,单链表较顺序存储结构效率越有优势
  8. h5 数字变化_前端/h5 D3.js实现根据数据动态更新图形/类似进度实时变化效果
  9. python不能加密_Python之加密模块
  10. mysql内置乐观锁吗_mysql 乐观锁详解