首先是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的区别的更多相关文章

  1. 在C#中IEnumerable与IEnumerator

    对于很多刚开始学习C#同学来说经常会遇到IEnumerable这个关键字,enumerate在字典里的解释是列举,枚举,因此可想而知这个关键字肯定是和列举数据有关的操作. public interfa ...

  2. C#中IEnumerable和IEnumerator区别

    IEnumerator:是一个真正的集合访问器,提供在普通集合中遍历的接口,有Current,MoveNext(),Reset(),其中Current返回的是object类型.IEnumerable: ...

  3. C#--IEnumerable 与 IEnumerator 的区别

    一. IEnumerator 解释:它是一个的集合访问器,使用foreach语句遍历集合或数组时,就是调用 Current.MoveNext()的结果. // 定义如下public interface ...

  4. C# ~ 从 IEnumerable / IEnumerator 到 IEnumerable<T> / IEnumerator<T> 到 yield

    IEnumerable / IEnumerator 首先,IEnumerable / IEnumerator 接口定义如下: public interface IEnumerable /// 可枚举接 ...

  5. C#中的 IList, ICollection ,IEnumerable 和 IEnumerator

    IList, ICollection ,IEnumerable 很显然,这些都是集合接口的定义,先看看定义: // 摘要: // 表示可按照索引单独访问的对象的非泛型集合. [ComVisible(t ...

  6. C#编程之IList<T>、List<T>、ArrayList、IList, ICollection、IEnumerable、IEnumerator、IQueryable 和 IEnumerable的区别

    额...今天看了半天Ilist<T>和List<T>的区别,然后惊奇的发现使用IList<T>还是List<T>对我的项目来说没有区别...  在C#中 ...

  7. 细说 C# 中的 IEnumerable和IEnumerator接口

    我们先思考几个问题: 为什么在foreach中不能修改item的值? 要实现foreach需要满足什么条件? 为什么Linq to Object中要返回IEnumerable? 接下来,先开始我们的正 ...

  8. 转载IEnumerable与IEnumerator区别

    public interface IEnumerable {     IEnumerator GetEnumerator(); }   public interface IEnumerator {   ...

  9. C#中IEnumerable、ICollection、IList、IQueryable 、IQueryable 、List之间的区别

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

随机推荐

  1. UiAutomator源代码分析之UiAutomatorBridge框架

    上一篇文章<UIAutomator源代码分析之启动和执行>我们描写叙述了uitautomator从命令行执行到载入測试用例执行測试的整个流程.过程中我们也描写叙述了UiAutomatorB ...

  2. Visual Studio 2010配置Opencv2.4.9

    转自: http://blog.csdn.net/huang9012/article/details/21811129 这篇文章作为OpenCV的启程篇,自然少不了先系统地介绍OpenCV开发环境的配 ...

  3. VC++ 学习笔记(三):摩登之路——C++/CLI简介

    在Windows上,除非我们必须得用C++来写界面,否则我会选择避免,避免学习和使用MFC.替代的方案是用C#来做界面,然后用C++/CLI来连接C#和Native C++.那么问题来了,C++/CL ...

  4. DRY原则和Shy原则

    保障可维护性的主要诀窍是遵循DRY原则和Shy原则. 在一个系统的整个生命周期里,理解和改动这类维护工作的比例一般非常之高.为了维护的方便,要尽量将系统划分为可以独立理解与改动的模块.这就要在设计的时 ...

  5. 几组User-Agent

    Your User Agent String is: Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.19 (KHTML, like Gecko) Ubun ...

  6. SharedPreference注册OnSharedPreferenceChangeListener一直无法回调问题

    注册代码如下: SharedPreferences sp = getSharedPreferences("AndroidDemo", Context.MODE_PRIVATE); ...

  7. Hive Streaming 追加 ORC 文件

    1.概述 在存储业务数据的时候,随着业务的增长,Hive 表存储在 HDFS 的上的数据会随时间的增加而增加,而以 Text 文本格式存储在 HDFS 上,所消耗的容量资源巨大.那么,我们需要有一种方 ...

  8. distri.lua重写开源手游服务器框架Survive

    Survive之前采用的是C+lua的设计方式,其中网关服务器全部由C编写,其余服务全部是C框架运行lua回调函数的方式编写游戏逻辑. 鉴于一般的手游对服务器端的压力不会太大,便将Survive用di ...

  9. akka cluster sharding source code 学习 (2/5) handle off

    一旦 shard coordinator(相当于分布式系统的 zookeeper) 启动,它就会启动一个定时器,每隔一定的时间尝试平衡一下集群中各个节点的负载,平衡的办法是把那些负载较重的 actor ...

  10. 一次受限于操作系统进程数的OOM

    在64bit机上跑应用,结果进程刚起来就挂,就刚起来就挂..还OOM,还fork不出新进程,尼玛,这什么情况? 1. 如果是应用层面OOM,那么不应该任何命令都不被执行了,不应该OS直接crash掉. ...