要是自己的类支持foreach ,必须在类中必须有GetEnumerator方法,该方法返回的是一个IEnumerator类型的枚举器;

public class MyStruct
{
public string[] sName = new string[] { "张三", "李四", "王五" };
public IEnumerator GetEnumerator()
{
return new MyStructEnumerator(sName);
}
}

  所以自己得写一个类类继承IEnumerator接口,并在类中实现IEnumerator接口;

public class MyStructEnumerator : IEnumerator
{
//要遍历的对象
private string[] sList;
public MyStructEnumerator(string[] get)
{
sList = get; //得到
}
    //索引
private int index = -1;
//获取当前项
public object Current
{
get
{
if(index>=0&&index<sList.Length)
{
return sList[index];
}
else
{
throw new IndexOutOfRangeException();
}
}
}
//移到下一个
public bool MoveNext()
{
if (index+1 < sList.Length)
{
index++;
return true;
}
else
{
return false;
}
}
     //重置
public void Reset()
{ index = -1;
}
}

  然后在实例化自己写的MyStruct就可以用foreach来遍历了;

或者更方便的办法,只需在MyStrcu中添加一个方法;(方法一)

public class MyStruct
{
public string[] sName = new string[] { "张三", "李四", "王五" }; //当返回值类型是IEnumerator时,编译器会自动帮我们生成一个“枚举类”,即实现了IEnumerator的接口的类
public IEnumerable GetObj()
{
for(int i=0;i<sName.Length;i++)
{
yield return sName[i];
}
}
}

  然后可以直接调用foreach(string res in MyStruct.GetObj){...};

也可以(方法2)

public class MyStruct
{
public string[] sName = new string[] { "张三", "李四", "王五" };
public IEnumerator GetEnumerator()
{
for(int i=0;i<sName.Length;i++)
{
yield return sName[i];
}
}
}

  之后直接调用foreach(string res in MyStruct);比上面的写法看起来方便在不用再去调用GetObj方法;

方法一和方法二的区别是一个要调用方法, 方法二不用调用方法是因为类里有GetEnumerator方法,foreach会认出这个方法,而方法一没有,所以要。出方法,方法一会自动去实现IEnumerable接口.

c# foreach枚举器的更多相关文章

  1. C#中的foreach语句与枚举器接口(IEnumerator)及其泛型 相关问题

    这个问题从<C#高级编程>数组一节中的foreach语句(6.7.2)发现的. 因为示例代码与之前的章节连贯,所以我修改了一下,把自定义类型改为了int int[] bs = { 2, 3 ...

  2. C# Foreach循环本质与枚举器

    对于C#里面的Foreach学过 语言的人都知道怎么用,但是其原理相信很多人和我一样都没有去深究.刚回顾泛型讲到枚举器让我联想到了Foreach的实现,所以进行一番探究,有什么不对或者错误的地方大家多 ...

  3. C#中的枚举器(转)

    术语表 Iterator:枚举器(迭代器) 如果你正在创建一个表现和行为都类似于集合的类,允许类的用户使用foreach语句对集合中的成员进行枚举将会是很方便的.这在C# 2.0中比 C# 1.1更容 ...

  4. C#枚举器接口IEnumerator的实现

    原文(http://blog.csdn.net/phpxin123/article/details/7897226) 在C#中,如果一个类要使用foreach结构来实现迭代,就必须实现IEnumera ...

  5. C#2.0中使用yield关键字简化枚举器的实现

    我们知道要使用foreach语句从客户端代码中调用迭代器,必需实现IEnumerable接口来公开枚举器,IEnumerable是用来公开枚举器的,它并不实现枚举器,要实现枚举器必需实现IEnumer ...

  6. C#图解教程 第十八章 枚举器和迭代器

    枚举器和迭代器 枚举器和可枚举类型 foreach语句 IEnumerator接口 使用IEnumerable和IEnumerator的示例 泛型枚举接口迭代器 迭代器块使用迭代器来创建枚举器使用迭代 ...

  7. C# 枚举器

    1:枚举器和可枚举类型 我们知道使用foreach可以遍历数组中的元素.那么为什么数组可以被foreach语句处理呢,下面我们就进行讨论一下这个问题. 2:使用foreach语句 我们知道当我们使用f ...

  8. C# 枚举器和迭代器

    一.枚举器(enumerator)和可枚举类型(enumeration) 我们都知道foreach语句可以用来遍历数组中的元素,但你有没有想过为什么它可以被foreach处理呢? 这是因为数组可以按需 ...

  9. 关于IEnumerator<T>泛型枚举器 和 IEnumerable<T>

    在开发中我们经常会用到 IEnumerable<T> xxx 或者 List<T> xxx 这种集合或者集合接口,实际上就是一个线性表嘛然后结合C#提供的语法糖 foreach ...

随机推荐

  1. 如何改变word修订模型下的视图

    在Word中执行与Find.Range等相关的操作时,需对修订模式下的文档进行特殊处理. 核心知识点 Word中的 RevisionsView 属性只有两种设置:显示标记的最终状态(Final Sho ...

  2. git使用经验

    一直想写一点关于git的文章,但是平时太懒了,没有写,现在写些经验这里,方便以后自己忘记了.

  3. protobuf NET使用

    首先,开源项目地址为: protobuf NET的GITHUB地址 下载下来后,打开项目,找到目录:Core/protobuf-net,生成一下,然后就可以在bin里得到protobuf-net.dl ...

  4. JQ动画 show hide

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. (导航控制器view)全屏幕滑动实现pop效果

    看到现在app 中越来越流行的手势滑动实现pop效果,心里很是痒痒跃跃欲试,经过多方查看资料,终于在简书上找到了详细的实现方案: 轻松学习之二——iOS利用Runtime自定义控制器POP手势动画 经 ...

  6. 不规则三角网 Delaunay——TIN

    http://blog.csdn.net/u010025211/article/details/25032209 知识点一:平面中判断一个点是否在三角形内部. #include <stdio.h ...

  7. (原+转)ROC曲线

    转自:http://baike.baidu.com/link?url=_H9luL0R0BSz8Lz7aY1Q_hew3JF1w-Zj_a51ggHFB_VYQljACH01pSU_VJtSGrGJO ...

  8. JMS & ActiveMQ小结

    JMS简介 JMS源于企业应用对于消息中间件的需求,使应用程序可以借助消息进行异步处理而互不影响.Sun公司和它的合作伙伴设计的JMS API定义了一组公共的应用程序接口和相应语法,使得Java程序能 ...

  9. window.location.href("url") 无法在chrome和Firefoxz中使用

    今天在js代码中加了一句window.location.href(‘url’)希望实现页面的跳转,IE中可以正常使用,但是Firefox却提示window.location is not a func ...

  10. ThinkPHP框架二

    ThinkPHP笔记二 1.1 TP框架的配置文件 在TP框架中,所有的配置文件都是自动加载的,加载的顺序:惯例配置<应用配置<调试配置<模块配置<动态配置 1. 惯例配置(T ...