IEnumerable 接口只包含一个抽象的方法 GetEnumerator(),它返回一个可用于循环访问集合的 IEnumerator 对象,IEnumerator 对象是一个集合访问器。

需要给自定义的类实现 foreach 功能,就需要实现 IEnumerable 接口,下面给出一个例子。

using System;
using System.Collections;
using System.Collections.Generic; class NewList<T> : IEnumerable //实现 IEnumerable 接口的 GetEnumerator()
{
private List<T> newList = new List<T>(); public void Add(T item)
{
newList.Add(item);
}
public IEnumerator GetEnumerator()
{
return this.newList.GetEnumerator();
}
} class Program
{
static void Main(string[] args)
{
NewList<string> newList = new NewList<string>();
newList.Add("a");
newList.Add("b");
foreach(string item in newList)
{
Console.WriteLine("item:" + item);
}
}
}

手工实现IEnumberable接口和IEnumerator接口中的方法实现的方式如下:

using System;
using System.Collections;
using System.Collections.Generic; class NewList<T> : IEnumerable //实现 IEnumerable 接口的 GetEnumerator()
{
private List<T> list = new List<T>(); public void Add(T item)
{
list.Add(item);
}
public IEnumerator GetEnumerator()
{
return new NewListEnumerator<T>(this);
} private class NewListEnumerator<T>: IEnumerator
{
private int position = -;
private NewList<T> newList;
public NewListEnumerator(NewList<T> newList)
{
this.newList = newList;
} public object Current
{
get
{
return newList.list[position];
}
} public bool MoveNext()
{
if(position < newList.list.Count - )
{
position++;
return true;
}
else
{
return false;
}
} public void Reset()
{
position = -;
}
}
} class Program
{
static void Main(string[] args)
{
NewList<string> newList = new NewList<string>();
newList.Add("a");
newList.Add("b");
foreach(string item in newList)
{
Console.WriteLine("item:" + item);
}
}
}

IEnumerable 和 IEnumerator的更多相关文章

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

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

  2. 迭代器学习之一:使用IEnumerable和IEnumerator接口

    写博客是检验我学习的成果之一以及自我总结的一种方式,以后会经常利用这种方式进行技术交流和自我总结,其中认识不深难免会有错误,但是一直懂得不懂就问,不懂就学的道理! 1.首先看一个简单的列子 , , , ...

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

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

  4. IEnumerable和IEnumerator

    概述 IEnumerable和IEnumerator接口存在的意义:用来实现迭代的功能! public interface IEnumerable { IEnumerator GetEnumerato ...

  5. 关于迭代器中IEnumerable与IEnumerator的区别

    首先是IEnumerable与IEnumerator的定义: 1.IEnumerable接口允许使用foreach循环,包含GetEnumerator()方法,可以迭代集合中的项. 2.IEnumer ...

  6. IEnumerable和IEnumerator 详解 (转)

    原文链接:http://blog.csdn.net/byondocean/article/details/6871881 参考链接:http://www.cnblogs.com/hsapphire/a ...

  7. C#基础知识系列九(对IEnumerable和IEnumerator接口的糊涂认识)

    前言 IEnumerable.IEnumerator到现在为止对这两个接口还是不太理解,不理解但是自己总是想着试着要搞明白,毕竟自己用的少,所以在此先记录一下.以备自己日后可以来翻查,同时也希望园子里 ...

  8. [转]那些年我还不懂:IList,ICollection,IEnumerable,IEnumerator,IQueryable

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

  9. 转载IEnumerable与IEnumerator区别

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

  10. IEnumerable、IEnumerator与yield的学习

    我们知道数组对象可以使用foreach迭代进行遍历,同时我们发现类ArrayList和List也可以使用foreach进行迭代.如果我们自己编写的类也需要使用foreach进行迭代时该怎么办呢? IE ...

随机推荐

  1. AutoIt3(AU3)开发的分辨率快速设置工具

    项目相关地址 源码:https://github.com/easonjim/Resolution_Settings bug提交:https://github.com/easonjim/Resoluti ...

  2. C++开发的基于UDP协议的聊天工具

    项目相关地址 源码:https://github.com/easonjim/UDPChat bug提交:https://github.com/easonjim/UDPChat/issues

  3. 【Alpha阶段】第四次Scrum例会

    会议信息 时间:2016.10.20 21:00 时长:20min 地点:大运村1号公寓5楼楼道 类型:日常Scrum会议 个人任务报告 姓名 今日已完成Issue 明日计划Issue 今日已做事务 ...

  4. BZOJ2152:聪聪可可

    传送门 点分治常规题.练习模板 //OJ 2077 //by Cydiater //2016.9.23 #include <iostream> #include <cstdio> ...

  5. [NOIP2014] 解方程&加强版 (bzoj3751 & vijos1915)

    大概有$O(m)$,$O(n\sqrt{nm})$,$O(n\sqrt{m})$的3个算法,其中后2个可以过加强版.代码是算法3,注意bzoj的数据卡掉了小于20000的质数. #include< ...

  6. 【原】redux异步操作学习笔记

    摘要: 发觉在学习react的生态链中,react+react-router+webpack+es6+fetch等等这些都基本搞懂的差不多了,可以应用到实战当中,唯独这个redux还不能,学习redu ...

  7. 最短路径(Floyd)算法

    #include <stdio.h>#include <stdlib.h>/* Floyd算法 */#define VNUM 5#define MV 65536int P[VN ...

  8. Java 毫秒转换为日期类型、日期转换为毫秒

    /毫秒转换为日期 public static void main(String[] args) { DateFormat formatter = new SimpleDateFormat(" ...

  9. python实现软件的注册功能(机器码+注册码机制)

    http://www.cnblogs.com/cquptzzq/p/5940583.html 一.前言: 目的:完成已有python图像处理工具的注册功能 功能:用户运行程序后,通过文件自动检测认证状 ...

  10. Java 创建文件夹和文件

    String path="D://my"; File folder=new File(path); if(!folder.exists() && !folder.i ...