关于迭代器中IEnumerable与IEnumerator的区别
首先是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的区别相关推荐
- C# IEnumerable和IEnumerator的区别,如何实现
IEnumerable接口和IEnumerator接口是.NET中非常重要的接口,二者有何区别? 1. 简单来说IEnumerable是一个声明式的接口,声明实现该接口的类就是"可迭代的en ...
- C#知识点总结系列:2、C#中IDisposable和IEnumerable、IEnumerator
C#中如何合理的释放非托管内存?在本文中我们将讲解使用IDisposable释放托管内存和非托管内存. A.首先需要让类实现IDisposable接口,然后实现IDispose方法. A.a核心Dis ...
- IEnumerable和IEnumerator 详解
IEnumerable接口是非常的简单,只包含一个抽象的方法GetEnumerator(),它返回一个可用于循环访问集合的IEnumerator对象.IEnumerator对象有什么呢?它是一个真正的 ...
- IEnumerable和IQueryable的区别以及背后的ExpressionTree表达式树
关于IEnumerable和IQueryable的区别,这事还要从泛型委托Func<T>说起.来看一个简单的泛型委托例子: class Program { static void Main ...
- java iter是否存在_Java中ListIterator和Iterator的区别以及ListIterator的应用
Java中ListIterator和Iterator详解与辨析 在使用java集合的时候,都需要使用Iterator.但是java集合中还有一个迭代器ListIterator,在使用List.Arra ...
- [转]那些年我还不懂:IList,ICollection,IEnumerable,IEnumerator,IQueryable
1.首先看一个简单的例子 int[] myArray = { 1, 32, 43, 343 };IEnumerator myie = myArray.GetEnumerator();myie.Rese ...
- python中的return和print的区别_python中return和print的区别(详细)
Huskiesir python最近正在研究.今天,我面临一个问题,那就是,返回和印刷的区别.双方都能输出结果.的区别是什么?闲话少说,看下面的例子.# Code1: def break_words( ...
- IEnumerable和IEnumerator详解
引言 IEnumerable是可枚举的所有非泛型集合的基接口, IEnumerable包含一个方法GetEnumerator(),该方法返回一个IEnumerator:IEnumerator提供通过C ...
- Spark中foreachPartition和mapPartitions的区别
Spark中foreachPartition和mapPartitions的区别 spark的运算操作有两种类型:分别是Transformation和Action,区别如下: Transformatio ...
最新文章
- python实现选择排序
- 移动端分步注册_移动应用程序的可用性测试:分步指南
- mysql备份至cos_宝塔面板网站文件/数据库定时同步备份至腾讯云COS设置
- 智能一代云平台(九):EclipseLink返回Object转为实体的分析
- 从BMW Vision iNEXT 看宝马如何进军自动驾驶 1
- 设计模式C++实现--Factory模式
- 智能合约的形式化描述、分析和验证
- 文本转成图片(自动换行、自定义字体),图片抗锯齿优化,图片压缩优化
- 创翼linux版本,创翼电信客户端for Mac-创翼客户端Mac版下载 V1.3.7-PC6苹果网
- 田刚:庞加莱猜想与几何
- android 摄像头黑屏,5+app 安卓调用摄像头黑屏 苹果可以
- Python自动化爬取天眼查数据
- uniapp中使用svga动画
- R语言使用lm函数构建简单线性回归模型(建立线性回归模型)、拟合回归直线、使用attributes函数查看线性回归模型的属性信息、获取模型拟合对应的残差值residuals
- 手风琴 html 左边,Layui手风琴左边的符号如何修改
- 3ds Max发生闪退怎么办?
- 用MySQL模拟消息队列
- 原来Python自带了数据库,用起来真方便
- C语言运算符优先级及结合性
- ssm+jsp计算机毕业设计CheatEngine学习系统4i3k0(程序+LW+源码+远程部署)
热门文章
- java override格式_Lambda表达式告别@override
- mysql 连接 分组_详解MySQL中的分组查询与连接查询语句
- mysql配置文件构成以及具体的配置demo
- Java项目实训报告
- 【吐血整理】用java编写一个登陆界面
- CyberDuck:Macos和Linux服务器简洁传大文件
- 对于插入和删除数据越频繁的操作 ,单链表较顺序存储结构效率越有优势
- h5 数字变化_前端/h5 D3.js实现根据数据动态更新图形/类似进度实时变化效果
- python不能加密_Python之加密模块
- mysql内置乐观锁吗_mysql 乐观锁详解