在C#中如何支持Foreach

原创 2001年11月29日 09:11:00

    在VB6中,我最喜欢For each语句,并让我的类支持这一特性,自然的我也希望C#中也有此功能,一查资料,马上发现C#支持Forcach,可没介绍任何让自己的类支持Foreach。还是看看MSDN吧。

    MSDN指出必须支持System.Collections.IEnumerable接口,而IEnumerable接口中仅有一个方法:GetEnumerator,他要求返回支持System.Collections.IEnumerator接口的对象引用,一看IEnumerator接口就明白了其工作原理,他有MoveNext、Reset方法和Current属性。

    老实说一开始我真的很不明白MS为什么不是直接支持IEnumerator接口就可以了,为什么要绕个弯呢,后来仔细一想,的确很有道理,叫我说我说不好,大致的意思是在多线程下提供多个状态,不知道对不对,反正我是这样认为的。

    看一下我写的演示代码:

    using System;

 

namespace WindowsApplication3

{

     public class class1

     {

          [STAThread]

          static void Main()

          {

               Demo d=new Demo();

              

               //Foreach演示代码

               foreach(int i in d)

                    Console.WriteLine(i);

          }

     }

 

     /// <summary>支持Foreach的演示类</summary>

     public class Demo:System.Collections.IEnumerable

     {

          //内部要枚举的数据

          int[] intList={1,2,3};

 

          public Demo(){}

 

          //对象支持IEnumerable接口,返回一个支持IEnumerator接口的实例

          public  System.Collections.IEnumerator GetEnumerator()

          {

               DemoForIEnumerator d=new DemoForIEnumerator(this);

               return d;

          }

         

          //索引器,从1开始索引

          public int this[int nIndex]

          {

               get{return intList[nIndex-1];}

          }

 

          //总数

          public int Length

          {

               get{return intList.Length;}

          }

     }

 

     /// <summary>支持IEnumerator接口的类</summary>

     class DemoForIEnumerator:System.Collections.IEnumerator

     {

          Demo mDemo;

          int per =0;

 

          public DemoForIEnumerator(Demo d)

          {mDemo=d;}

 

          //向前移动,无法继续移动时返回false,否则返回true。

          public System.Boolean MoveNext()

          {

               if (per>=mDemo.Length)

                    return false;

               else

               {

                    per++;

                    return true;

               }

          }

 

          //复位

          public void Reset()

          {per=0;}

 

          //当前指针下的值。

          public object Current

          {

               get{return mDemo[per];}

          }

     }

}

 

在这段代码运行时我发现Reset方法根本不会执行,我不知道他什么时候会调用。其实上面的代码如果你不想额外编写一个类,可以在GetEnumerator方法中返回this,然后自己也支持IEnumerator接口就可以了。

 

 

C++开发者都应该使用的10个C++11特性

C++开发者都应该使用的10个C++11特性  在C++11新标准中,语言本身和标准库都增加了很多新内容,本文只涉及了一些皮毛。不过我相信这些新特性当中有一些,应该成为所有C++开发者的...
  • molti
  • molti
  • 2013年12月19日 13:57
  • 15218

c:foreach标签的使用

简单点说,c:forEach>标签的作用就是迭代输出标签内部的内容。它既可以进行固定次数的迭代输出,也可以依据集合中对象的个数来决定迭代的次数。          c:forEach>标签的语法定...
  • zheng0518
  • zheng0518
  • 2013年08月28日 21:58
  • 10048

web端ajax传递foreach的所有的遍历数据

1. 对于 如何 在 Jsp页面 使用 ajax                                     把所有的 foreach 数据 依次 传递 到 action页面的 技术 ...
  • sinat_27639721
  • sinat_27639721
  • 2016年10月11日 19:39
  • 2172

c#创建自定义集合类并使之支持使用foreach迭代

各种集合都可以是foreach来实现迭代访问,下面我们自定义集合类来实现foreach迭代访问 using System; using System.Collections.Generic; cla...
  • jialeheyeshu
  • jialeheyeshu
  • 2016年08月28日 20:26
  • 820

c#Foreach.rar

  • 2009年10月05日 13:51
  • 5KB
  • 下载

C# Foreach用法

  • 2015年10月31日 20:52
  • 608B
  • 下载

C#中foreach的用法

foreach 语句为数组或对象集合中的每个元素重复一个嵌入语句组。foreach 语句用于循环访问集合以获取所需信息,但不应用于更改集合内容以避免产生不可预知的副作用。嵌入语句为数组或集合中的每个元...
  • zollll
  • zollll
  • 2017年07月28日 11:30
  • 90

C#中的foreach的用法

foreach 语句为数组或对象集合中的每个元素重复一个嵌入语句组。foreach 语句用于循环访问集合以获取所需信息,但不应用于更改集合内容以避免产生不可预知的副作用。 能够应用的编程语言类别:J...
  • a364416036
  • a364416036
  • 2016年08月01日 15:34
  • 982

C#中 for与foreach的效率比较

在很多情况下for和foreach具有同样的功能,选择for还是foreach很多人可能都是看自己的喜好,本测试试图通过 来真是测试数据来比较他们的执行效率。希望能给大家对他们的时候带来一些帮助。 ...
  • wuzhengqing1
  • wuzhengqing1
  • 2012年08月10日 13:58
  • 7481

C# 学习笔记 foreach循环中的迭代器

迭代器是一个代码块,按顺序提供了要在fordeach循环中使用的所用值。一般情况下这个代码块是一个方法,但也可以使用属性访问器和其他代码作为迭代器。下面只介绍方法。      无论代码块是什么,其返...
  • gbasp2008
  • gbasp2008
  • 2015年01月19日 15:52
  • 215
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在C#中如何支持Foreach
举报原因:
原因补充:

(最多只允许输入30个字)