关于迭代器中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;
else
return false;
}
public static bool operator <(person a, person b)
{
if (a.Age > b.Age)
return false;
else
return true;
}
public static bool operator >=(person a, person b)
{
if (a.Age >= b.Age)
{
return true;
}
else
return false;
}
public static bool operator <=(person a, person b)
{
if (a.Age <= b.Age)
return true;
else
return 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 = ;
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", );
person b = new person("Json", );
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(,)
{ }
public Primes(long minNum,long maxNum)
{
if(minNum<)
{
min=;
}else{
min = minNum;
}
max = maxNum;
}
public IEnumerator GetEnumerator()//返回的是IEnumerator
{
for(long i=min;i<max;i++)
{
int flag = ;
for(long j=;j<Math.Sqrt(min);j++)
{
if(i%j==)
{
flag = ;
break;
}
}
if(flag==)
{
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(, );
foreach(long i in s)
{
Console.WriteLine("{0}\t", i);
}
Console.ReadKey();
}
}
}
关于迭代器中IEnumerable与IEnumerator的区别的更多相关文章
- 在C#中IEnumerable与IEnumerator
对于很多刚开始学习C#同学来说经常会遇到IEnumerable这个关键字,enumerate在字典里的解释是列举,枚举,因此可想而知这个关键字肯定是和列举数据有关的操作. public interfa ...
- C#中IEnumerable和IEnumerator区别
IEnumerator:是一个真正的集合访问器,提供在普通集合中遍历的接口,有Current,MoveNext(),Reset(),其中Current返回的是object类型.IEnumerable: ...
- C#--IEnumerable 与 IEnumerator 的区别
一. IEnumerator 解释:它是一个的集合访问器,使用foreach语句遍历集合或数组时,就是调用 Current.MoveNext()的结果. // 定义如下public interface ...
- C# ~ 从 IEnumerable / IEnumerator 到 IEnumerable<T> / IEnumerator<T> 到 yield
IEnumerable / IEnumerator 首先,IEnumerable / IEnumerator 接口定义如下: public interface IEnumerable /// 可枚举接 ...
- C#中的 IList, ICollection ,IEnumerable 和 IEnumerator
IList, ICollection ,IEnumerable 很显然,这些都是集合接口的定义,先看看定义: // 摘要: // 表示可按照索引单独访问的对象的非泛型集合. [ComVisible(t ...
- C#编程之IList<T>、List<T>、ArrayList、IList, ICollection、IEnumerable、IEnumerator、IQueryable 和 IEnumerable的区别
额...今天看了半天Ilist<T>和List<T>的区别,然后惊奇的发现使用IList<T>还是List<T>对我的项目来说没有区别... 在C#中 ...
- 细说 C# 中的 IEnumerable和IEnumerator接口
我们先思考几个问题: 为什么在foreach中不能修改item的值? 要实现foreach需要满足什么条件? 为什么Linq to Object中要返回IEnumerable? 接下来,先开始我们的正 ...
- 转载IEnumerable与IEnumerator区别
public interface IEnumerable { IEnumerator GetEnumerator(); } public interface IEnumerator { ...
- C#中IEnumerable、ICollection、IList、IQueryable 、IQueryable 、List之间的区别
一:一个简单的例子 int[] myArray = { 1, 32, 43, 343 }; IEnumerator myie = myArray.GetEnumerator(); myie.Reset ...
随机推荐
- Ecshop 最小起订量如何设置
第一步,商品表必须有个字段 代表某个商品 最小订购数量->min_number 打开goods表 在最后字段添加一个min_number tinyint类型 默认值为0 代表没有最小起 ...
- SQL的主键和外键约束
SQL的主键和外键的作用: 外键取值规则:空值或参照的主键值. (1)插入非空值时,如果主键表中没有这个值,则不能插入. (2)更新时,不能改为主键表中没有的值. (3)删除主键表记录时,你可以在建外 ...
- iis,w3wp一直出现WerFault.exe应用程序错误
这个进程是Windows错误报告技术里的一个东西,来收集软件崩溃或者挂起后的数据然后向微软反馈报告.关闭系统的错误报告功能后看看 1:打开 运行 (热键:win+R)输入 gpedit.msc 打开 ...
- 大型网站系统架构演化之路【mark】
前言 一 个成熟的大型网站(如淘宝.天猫.腾讯等)的系统架构并不是一开始设计时就具备完整的高性能.高可用.高伸缩等特性的,它是随着用户量的增加,业务功能的 扩展逐渐演变完善的,在这个过程中,开发模式. ...
- [转]ios平台内存常见问题
本文转自CocoaChina,说的满详细的: 链接地址:http://www.cocoachina.com/bbs/read.php?tid=94017&keyword=%C4%DA%B4%E ...
- 初探Stage3D(一) 3D渲染基础原理
关于本文 本文主要想介绍一下3D渲染的基本流程,及怎样把一个三角形(0,1,0),(1,0,1),(0,0,1)最终渲染到屏幕上来.文章的目的是对3D渲染流程做一个简单的介绍,其中不涉及任何语言的AP ...
- Factorization Machine
Factorization Machine Model 如果仅考虑两个样本间的交互, 则factorization machine的公式为: $\hat{y}(\mathbf{x}):=w_0 + \ ...
- 跟随标准与Webkit源码探究DOM -- 获取元素之getElementsByName
按照name属性获取多元素 -- getElementsByName 标准 DOM 1 定义在HTMLDocument Interface 中,原型NodeList getElementsByName ...
- Linux 学习碎片
1.登录远程机器: ssh 远程机器用户名@远程机器IP ssh root@192.168.1.101 2.不同机器之前拷贝文件 #拷贝本机单个文件到远程服务器 scp /home/user1/tb. ...
- TeamViewer连接Windows8.1系统黑屏解决方案
TeamViewer用win7连接win8.1 都是64位系统,总是黑屏,可以看到鼠标也联动了,聊天传输文件都没有问题,反向用win8.1连接win7也没问题,而且TeamViewer更新到最新版本了 ...