要是自己的类支持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. 【组合数学:第一类斯特林数】【HDU3625】Examining the Rooms

    Examining the Rooms Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  2. Android显示系统设计框架介绍

    1. Linux内核提供了统一的framebuffer显示驱动,设备节点/dev/graphics/fb*或者/dev/fb*,以fb0表示第一个显示屏,当前实现中只用到了一个显示屏. 2. Andr ...

  3. if分支的四种形式

    分支:——四种if一.if(条件表达式){} 二.if(条件表达式){}else{} 三.if(条件表达式){}else if(条件表达式){}else if(条件表达式){}....else{} 四 ...

  4. C#钩子应用实例

    C#钩子应用实例一.写在最前 本文的内容只想以最通俗的语言说明钩子的使用方法,具体到钩子的详细介绍可以参照下面的网址: http://www.microsoft.com/china/community ...

  5. CAShapeLayer + UIBezierPath

    UIBezierPath: UIBezierPath是在 UIKit 中的一个类,继承于NSObject,可以创建基于矢量的路径.使用此类可以定义常见的圆形.多边形等形状 .我们使用直线.弧(arc) ...

  6. javascript 事件代理及应用

    事件代理又叫事件委托在前端发开中实际是非常有用的,说事件代理之前我们先说说事件绑定 <p onclick="test()" ></p> function t ...

  7. 2015.4.10-SQL 高级查询(二)

    1.TOP字句: 用于规定要返回的记录的数目 select top number(个数)/percent(百分数)  列名  from 表名  2.like模糊查询,用于where字句中,以及通配符 ...

  8. ecshop简单结构

    Ecshop包括的文件夹有admin.api.cert.data.images.includes.js. languages.plugins.temp.theme.wap.widget这些文件夹,和根 ...

  9. 资源回收 left

    select DISTINCT human.tid,log_pv_change.systafftid from human left join human_user on human.tid=huma ...

  10. 使用PHP自动部署GIT代码

    最近在使用Coding的代码托管,顺便设置了WebHook自动部署,过程还是挺艰辛的,主要还是没搞懂Linux的权限控制,不过好在弄好了,分享一下获益最深的一篇文章,供大家参考,原文是英文版的,我的英 ...