分享

迭代器的使用

 昵称10504424 2013-07-09

1、C#中的迭代器的作用  http://zhidao.baidu.com/question/110561432.html

2、详解C#迭代器  http://www.cnblogs.com/yangecnu/archive/2012/03/17/2402432.html

3、msdn 迭代器 http://msdn.microsoft.com/zh-cn/library/dscyy5s0(VS.80).aspx

4、C# IEnumerable和IEnumerator的区别 http://www.cnblogs.com/shaosks/archive/2011/09/27/2193270.html

一、迭代器的作用                                                                                                                                                                              

看了好几篇文章,也翻了翻《C#4.0图解教程》,还是觉得如下这段写的不错

  迭代器模式是设计模式中行为模式(behavioral pattern)的一个例子,他是一种简化对象间通讯的模式,也是一种非常容易理解和使用的模式。简单来说,迭代器模式使得你能够获取到序列中的所有元素而不用关心是其类型是array,list,linked list或者是其他什么序列结构。这一点使得能够非常高效的构建数据处理通道(data pipeline)--即数据能够进入处理通道,进行一系列的变换,或者过滤,然后得到结果。事实上,这正是LINQ的核心模式。

在C#1中已经内建了对迭代器的支持,那就是foreach语句。使得能够进行比for循环语句更直接和简单的对集合的迭代,编译器会将foreach编译来调用GetEnumerator和MoveNext方法以及Current属性,如果对象实现了IDisposable接口,在迭代完成之后会释放迭代器。但是在C#1中,实现一个迭代器是相对来说有点繁琐的操作。C#2使得这一工作变得大为简单,节省了实现迭代器的不少工作。

二、简单代码实现:                                                                                                                                                                         

《深入理解C# 第二版》中关于C#1.0 实现迭代其的代码如下:

(1)声明IEnumerable接口

(2)实现IEnumerator接口

(3)Main()方法中的代码实现

我们发现这样手写来实现迭代器的功能代码量确实有写太大了,那么在C#2.0中就采用yield语句简单迭代

三、对以上的总结:以上是不使用接口的枚举数                                                                                                                                         

缺点:

1、Current返回的对象是object类型,对于值类型而言,在由Current返回之前必须装箱成object,在从Current获取之后,又必须再一次拆箱,如果需要操作大量的数据,会打来严重的性能问题、

2、类型不安全。值被作为对象来枚举,所以可以是任何类型,这就消除了编译时的类型检测。

四、泛型接口 IEnumerator<T>     IEnumerable<T>                                                                                                                            

IEnumerator<T>接口使用泛型来返回实际的类型,而不是object类型的引用

 

IEnumerable

 

复制代码
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Collections;
 6 //using System.Collections.Generic;
 7 
 8 namespace IEnumerator_T
 9 {
10     class Program
11     {
12         static void Main(string[] args)
13         {
14             //string[] colors = { "Red","Green","Blue"};
15             //ColorEnumerator col = new ColorEnumerator(colors);
16             //Console.ReadKey();
17             MyColors my = new MyColors();
18             foreach (string item in my)
19             {
20                 Console.WriteLine(item);
21             }
22             Console.ReadKey();
23         }
24     }
25 
26     class ColorEnumerator : IEnumerator<string>
27     {
28         string[] Colors;
29         int Position = -1;
30         public ColorEnumerator(string [] colors)
31         {
32             Colors=new string[colors.Length];
33             for (int i = 0; i < colors.Length;i++ )
34             {
35                 Colors[i] = colors[i];
36                // Console.WriteLine(Colors[i]);
37             }
38         }
39         public string Current
40         {
41             get
42             { 
43                 return Colors[Position];
44             }
45         }
46         object IEnumerator.Current
47         {
48             get 
49             {
50                 return Colors[Position]; 
51             }
52         }
53         public bool MoveNext()
54         {
55             if (Position < Colors.Length - 1)
56             {
57                 Position++;
58                 return true;
59             }
60             else
61             {
62                 return false;
63             }
64         }
65         public void Reset()
66         {
67             Position = -1;
68         }
69         public void Dispose()
70         {
71            // this.Dispose();
72         }
73     }
74     class MyColors:IEnumerable<string>
75     {
76         string[] Colors = { "Red","Yellow","Blue"};
77         public IEnumerator<string> GetEnumerator()
78         {
79             return new ColorEnumerator(Colors);
80         }
81         IEnumerator IEnumerable.GetEnumerator()
82         {
83             return new ColorEnumerator(Colors);
84         }
85     }
86    }
复制代码

五、由于上面的种种不便,迭代器开始闪亮登场了                                                                                                                                       

 1、迭代器可自动帮助生成可枚举类型和枚举数

使用迭代器来创建枚举数

BlackAndWhite迭代器方法返回IEnumerator<string>,MyClaa类通过返回由BlackAndWhite返回的对象来实现GetEnumerator方法

使用迭代器来创建可枚举类型

 

 

六、总结一下:                                                                                                                                                                                

(1)简单来说IEnumerable是声明式接口
       public interface IEnumerable

       {

      IEnumerator GetEnumerator();

       }

(2)IEnumerator是实现式接口

       public interface IEnumerator

       {

     object Current(get;);

            bool MoveNext();

            void Reset();

       }

(3)Collection要支持foreach进行遍历就必须实现IEnumerable,并以某种方式返回迭代器对象IEnumerator 。

 

 

 

 

 

 

 

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多