关于迭代器中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 ...
随机推荐
- web项目总结
web项目 Webroot下面的index.jsp页面的内容: <%@ page language="java" pageEncoding="UTF-8" ...
- Maven3路程(三)用Maven创建第一个web项目(2)servlet演示
上一章用Maven新建了web项目成功后,本文演示在此基础上应用servlet. 1.首先修改pom.xml文件,添加servlet依赖 <project xmlns="http:// ...
- Android中AutoCompleteTextView的使用
1.http://blog.csdn.net/FX_SKY/article/details/9326129 此博客讲解了auto组件如何使用baseAdapter来扩展功能,推荐参照此博客写demo ...
- BugTracker.NET的配置
需求管理+任务管理+bug管理+看板管理 要求一定要简单,切忌不要太复杂 之前用的禅道的,功能虽然很强大,但是忒复杂了,用不下去. 几点需要注意的地方: 1.web.config里邮件的地方有好几个地 ...
- c# 垮线程调用控件
http://www.cnblogs.com/TankXiao/p/3348292.html
- AX 与Citrix打印机问题
国外文章,抄个链接,备查 http://blogs.msdn.com/b/axsupport/archive/2010/07/06/ax-2009-citrix-amp-terminal-server ...
- iOS8中使用CoreLocation定位[转]
本文转自:http://blog.devzeng.com/blog/ios8-corelocation-framework.html iOS8以前使用CoreLocation定位 1.首先定义一个全局 ...
- java之对象转型2
public class TestCasting2{ public static void main(String args[]){ TestCasting2 test2= new TestCasti ...
- (OSP)外包工单关工单失败
会计同事反映,在关几个外包(OSP)工单时,系统报错.错误讯息如下.检查错误讯息,发现Number of jobs failed in Delivered Quantity : 2.检查工单数据,均无 ...
- html中css三种常见的样式选择器 zz
1:标签选择器 标签选择器,是所有带有某种标签的都生效.这里以p为例,也就是所有的带有p标记的都会这样的样式 <html><head><styletype="t ...