c# foreach枚举器

要是自己的类支持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接口.

时间: 2024-08-02 13:51:52

c# foreach枚举器的相关文章

SSIS【Foreach 循环容器_Foreach 文件枚举器】(导入路径下的所有txt文件的内容) (转)

原文:http://blog.csdn.net/kk185800961/article/details/12276449 SQLServer 2008 R2 SSIS_Foreach 循环容器_Foreach 文件枚举器(导入路径下的所有txt文件的内容) 1. 拖动一个 [Foreach 循环容器]到[控制流]中,再拖动一个[数据流任务]到[Foreach 循环容器]中.如图: 2.编辑[Foreach 循环容器],在选项[集合]中选择[Foreach 文件枚举器],配置要遍历的文件夹及文件类

C# Foreach循环本质与枚举器

对于C#里面的Foreach学过 语言的人都知道怎么用,但是其原理相信很多人和我一样都没有去深究.刚回顾泛型讲到枚举器让我联想到了Foreach的实现,所以进行一番探究,有什么不对或者错误的地方大家多多斧正. 1.创建一个控制台应用程序 2.编写测试代码并分析 在Program类中写一个foreach循环 class Program { static void Main(string[] args) { List peopleList = new List() { "张三", &quo

C#知识点-枚举器和迭代器

一.几个基本概念的理解 问题一:为什么数组可以使用foreach输出各元素 答:数组是可枚举类型,它实现了一个枚举器(enumerator)对象:枚举器知道各元素的次序并跟踪它们的位置,然后返回请求的当前项 问题二:不用foreach能不能遍历各元素 问题三:什么是可枚举类 答:可枚举类是指实现了IEnumerable接口的类:IEnumerable接口只有一个成员GetEnumerator方法,它返回对象的枚举器 问题四:什么是枚举器 答:实现了IEnumerator接口的枚举器包含三个函数成

C# 枚举器

1:枚举器和可枚举类型 我们知道使用foreach可以遍历数组中的元素.那么为什么数组可以被foreach语句处理呢,下面我们就进行讨论一下这个问题. 2:使用foreach语句 我们知道当我们使用foreach语句的时候,这个语句为我们依次取出了数组中的每一个元素. 例如下面的代码: 1 int[] arr = { 1, 2, 3, 4, 5, 6 }; 2 foreach( int arry in arr ) 3 { 4 Console.WriteLine("Array Value::{0}

枚举器对象与可枚举类型

1.IEnumerator与IEnumerable接口 IEnumerator接口:实现此接口的为枚举器类型,此接口包含3个方法Current.MoveNext.Reset. IEnumerable接口:实现此接口只需实现一个方法GetEnumerator得到一个枚举器. class ColorEnumerator : IEnumerator //实现枚举器接口:Current,MoveNext,Reset共3种方法 { string[] _colors; int _position = -1;

枚举器和linq

Iterator:枚举器 如果你正在创建一个表现和行为都类似于集合的类,允许类的用户使用foreach语句对集合中的成员进行枚举将会是很方便的. 我们将以创建一个简单化的List Box作为开始,它将包含一个8字符串的数组和一个整型,这个整型用于记录数组中已经添加了多少字符串.构造函数将对数组进行初始化并使用传递进来的参数填充它. using System; using System.Collections; using System.Collections.Generic; using Sys

IEnumerable公开枚举器

// 摘要: //     公开枚举器,该枚举器支持在非泛型集合上进行简单迭代. [ComVisible(true)] [Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")] public interface IEnumerable { // 摘要: //     返回一个循环访问集合的枚举器. // // 返回结果: //     可用于循环访问集合的 System.Collections.IEnumerator 对象. [DispId(-4)]

C#枚举器接口IEnumerator的实现

原文(http://blog.csdn.net/phpxin123/article/details/7897226) 在C#中,如果一个类要使用foreach结构来实现迭代,就必须实现IEnumerable或IEnumerator接口.其中,IEnumerator接口定义了实现枚举器模式的方法IEnumerator.MoveNext()和IEnumerator.Reset()和成员属性IEnumerator.Count,而IEnumerable接口的唯一方法IEnumerable.GetEnum

枚举器和可枚举类型

枚举器和可枚举类型 前面我们已经知道了使用foreach语句可以遍历数组中的元素.但是为什么那么做呢? 原因是数组按需提供了一个叫做枚举器的对象.枚举器可以依次返回请求数组中的元素. 枚举器知道项的次序并且跟踪它所在序列中的位置,然后返回请求的当前项. 获取一个对象枚举器的方法是调用对象的GetEnumerator方法.实现GetEnumerator方法的类型叫做可枚举类型. 数组是可枚举类型. IEnumerator接口 实现了IEnumerator接口的枚举器包含3个函数成员:Current