首先是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. 修改eclipse启动时eclipse使用的jre

    eclipse在启动的时候,和环境变量中的jdk不兼容,可以单独制定eclipse运行的jre. 方法: 在eclipse的配置文件里增加-vm参数即可. 打开eclipse目录下的eclipse.i ...

  2. sql server trace 和 Profiler

    MS SQL Server Profiler概述:       MS SQL Server Profiler是SQL Trace的GUI接口,提供对SQL Server Database Engine ...

  3. 【原】android本地推送

    android本地推送的实现原理:开启一个BroadcastReceiver和一个AlarmManager,闹钟设置推送唤醒时间,BroadcastReceiver一直在检测是否应该推送. 目前遗留问 ...

  4. Oracle 11g RAC客户端使用SCAN IP无法连接问题

    Oracle 版本:11.2.0.1.0 客户端:Windows Server 2003/PLSQL Developer Oracle服务器端的ip设置如下: ##公网ip 192.168.135.2 ...

  5. postgresql 获取刚刚插入的数据主键id

    postgresql不支持last_insert_id()方法,恶心到啦: 不过还好它有其他的解决方案: 创建一个测试数据表: CREATE TABLE test.test18 ( id serial ...

  6. 图文详解远程部署ASP.NET MVC 5项目

    话外篇: 由于感觉自己的机器比较慢,配置不好,所以最近想把之前的项目部署到实验室的服务器上,但是由于常不在实验室,所以在想能不能远程部署.因此今天专门研究了一下具体的过程,下面和大家分享一下.本人新手 ...

  7. js两种定义函数、继承方式及区别

    一:js两种定义函数的方式及区别 1:函数声明: function sayA() { alert("i am A"); } 2:函数表达式: var sayB = function ...

  8. Android样式的开发:drawable汇总篇

    Android有很多种drawable类型,除了前几篇详细讲解的shape.selector.layer-list,还有上一篇提到的color.bitmap.clip.scale.inset.tran ...

  9. JS获取跨域的cookie实例

    如果说JS能实现跨域cookie,你可能觉得不太可能实现,不过事实上,这个还是可以搞定的,不过需要一定的条件才行的哦!具体方案如下: 一共需要3个文件,第一个文件为需要获取cookie的页面,在这个页 ...

  10. [CS231n-CNN] Linear classification II, Higher-level representations, image features, Optimization, stochastic gradient descent

    课程主页:http://cs231n.stanford.edu/ loss function: -Multiclass SVM loss: 表示实际应该属于的类别的score.因此,可以发现,如果实际 ...