C#枚举器和迭代器

Foreach能够获取数组中的每一个元素,原因数组能够提供一个枚举器的对象。对于枚举器类型而言,必须有一个方法来获取它。获取一个对象枚举器的方法是调用对象的GetEnumerator方法。数组是可枚举类型。

IEnumerator接口:

实现了IEnumerator接口的枚举器包含了Current、MoveNext以及Reset函数成员。

Current是返回序列中当前位置的属性:

  1. 它是只读属性。
  2. 它返回object类型的引用,所以可以返回任何类型

MoveNext是枚举器位置前进到下一项的方法。它也返回bool,指示新的位置是有效还是无效:

  1. 如果位置有效,返回true
  2. 如果位置无效,返回false
  3. 枚举器原始位置在序列的第一项之前,因此MoveNxet必须在第一次使用Current之前。

Rest是把位置重置为原始状态。

IEnumerable接口:

可枚举类是指实现了IEnumerable接口的类。它只有一个成员——GetEnmuerator方法,返回对象的枚举器。

示例:

  using System;

  using System.Collections;

  class ColorEnumerator:IEnumerator{

    string []_colors;

    int _positon=-1;

    public ColorEnumerator(string []the){

    _colors=new string[the.length];
    for(int i=0;i<the.length;i++)

      _colors[i]=the[i];}

    public object Current(){

      return _colors[_positon];}

    public bool MoveNext(){

      if(_positon==-1||_positon>=_colors.lenth)

        return false;

      _positon++;

      return true;}

    public void Reset(){

      _positon=-1;}}

    class test:IEnumerable{

      string Colors={“Black”,”White”};

      public IEnumrator GetEnmurator{

        return new ColorEnumrator(Colors);}

      class Program{

        static void main(){

          test t=new test();

          for(var s in test)

          Console.WriteLine(s);

      }}

泛型枚举接口:

IEnumerator<T> 返回枚举类型

IEnumerable<T> 返回枚举器类型

迭代器

从C#2.0开始提供了更简单的创建枚举器和可枚举类型的方式。实际上编译器为我们创建他们。这种结构叫做迭代器。我们可以把手动编码的可枚举类型和枚举器替换为由迭代器生成的可枚举类型和枚举器。

迭代器块:有一个或多个yield语句的代码块。

常见迭代器模式:

当我们实现返回枚举器的迭代器时,必须实现GetEnumerator来让类可枚举,它返回由迭代器返回的枚举器.

如果我们在类中实现迭代器返回可枚举类型,我们可以让类实现GetEnumerator来让类本身可被枚举,或不实现GetEnumerator让类本身不可被枚举。

如果实现GetEnmertator,让它调用迭代器方法以获取自动生成的实现IEnumerable的类实例。然后,从IEnumerable对象返回的GetEnumerator创建的枚举器。第一个foreach

如果不实现GetEnumerator使类本身不枚举,仍然可使用由迭代器返回的可枚举类,只需要调用迭代器方法。第二个foreach

  class Myclass{

    public IEnumerator<string>GetEnumerator(){

      return IteratorMethod().GetEumerator();}

    public IEnumerable<string>IteratorMethod(){

      yield return “Fuck”;

      yield return “Fuck1”;

      yield return “Fuck2”;}}

    ……

    Main(){

      Myclass mc=new Myclass();

        foreach(var str in mc)

        ……

      foreach(var str in mc.IteratorMethod())

        ……

原文地址:https://www.cnblogs.com/dlvguo/p/9695104.html

时间: 2024-10-29 00:47:19

C#枚举器和迭代器的相关文章

设计模式 - 适配器模式(adapter pattern) 枚举器和迭代器 详解

适配器模式(adapter pattern) 枚举器和迭代器 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考适配器模式(adapter pattern): http://blog.csdn.net/caroline_wendy/article/category/2281679 Java早期版本的枚举器(Enumeration)和现在的迭代器(Iterator) 可以使用适配器(adapter)进行转换. 适配器(adapter)代码: /** *

设计模式 - 适配器模式(adapter pattern) 枚举器和迭代器 具体解释

适配器模式(adapter pattern) 枚举器和迭代器 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考适配器模式(adapter pattern): http://blog.csdn.net/caroline_wendy/article/category/2281679 Java早期版本号的枚举器(Enumeration)和如今的迭代器(Iterator) 能够使用适配器(adapter)进行转换. 适配器(adapter)代码: /**

枚举器和迭代器

一.枚举器和可枚举类型 1.0   一个简单的例子 1 static void Main(string[] args) 2 { 3 int[] arr = { 2,3,5,8}; 4 foreach (int item in arr) 5 { 6 Console.WriteLine("item's Value is :{0}",item); 7 } 8 Console.ReadKey(); 9 } 上边例子通过foreach依次取出数组中的元素并打印,为什么数组能够实现这种操作呢?原因

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

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

ruby迭代器枚举器

迭代器一个迭代器是一个方法,这个方法里面有yield语句,使用了yield的方法叫做迭代器,迭代器并非一定要迭代,与传递给这个方法的块进行数据传输 yield将数据传给代码快,代码块再把数据传输给yield each方法就是一个迭代器,里面有yield语句 枚举器1 一个枚举器是Enumerable::Enumerator的一个对象,Enumerable是一个模块2 使用枚举器 1.8的时候需要 require 'enumerator',在2.1就不用了3 可以通过new来实例化一个枚举器,但是

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}

IEnumerable公开枚举器

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

4)装饰器、迭代器、生成器以及内置函数

 装饰器.迭代器.生成器以及内置函数 装饰器: 原函数前后增加功能,切不改变函数的原本使用方式 import timedef wrapper(f):    def inner():        start = time.time()        f()        end = time.time()        print('执行效率为%s'%(end-start))    return inner @wrapperdef func():    print('this is func')

for..in遍历,枚举器

#pragma mark ------------for循环遍历集合中的元素------ //创建一个数组,包含5个字符串对象,倒序取出数组中的所有元素,并存储到另一可变数组中 NSArray *array = @[@"1", @"2", @"3", @"4", @"5"]; NSMutableArray *marray = [NSMutableArray arrayWithCapacity:0]; for