SAL

  博客园  :: 首页  :: 新随笔  :: 订阅 订阅  :: 管理

IEnumerator IEnumerable 总结 part I

Posted on 2008-03-21 15:10  SAL  阅读(291)  评论(0编辑  收藏  举报
如果要迭代一个类,可使用GetEnumerator()方法,其返回值类型是IEnumerator,可以让该类继承IEnumerator, IEnumerable这两个接口,foreach语句隐式地调用了集合的无参数GetEnumerator方法以获得一个枚举器我找了一个曾经做过的例子:
Code

由集合所定义的只能有一个这样的无参数 GetEnumerator方法,但经常有多种枚举方式,以及通过参数控制枚举的方法。在这种情况下,集合可以使用迭代器实现返回可枚举接口之一的属性和方法。如下:
 1 class MusicTitles
 2    {
 3       string[] names = {
 4          "Tubular Bells"
 5          "Hergest Ridge",
 6          "Ommadawn"
 7          "Platinum"
 8       };
 9 
10       public IEnumerator GetEnumerator()
11       {
12          for (int i = 0; i < 4; i++)
13          {
14             yield return names[i];
15          }
16       }
17 
18       public IEnumerable Reverse()
19      {
20         for (int i = 3; i >= 0; i--)
21         {
22             yield return names[i];
23         }
24       }
25 
26       public IEnumerable Subset( int index, int length)
27       {
28          for (int i = index; i < index + length; i++)
29          {
30             yield return names[i];
31          }
32       }
33 
34       public static void testMusicTitels()
35       {
36          MusicTitles titles = new MusicTitles();
37          foreach (string title in titles)
38          {
39             Console.WriteLine(title);
40          }
41 
42          Console.WriteLine();
43          Console.WriteLine("reverse");
44          foreach (string title in titles.Reverse())
45          {
46             Console.WriteLine(title);
47          }
48          Console.WriteLine();
49          Console.WriteLine("subset");
50          foreach (string title in titles.Subset(22))
51          {
52             Console.WriteLine(title);
53          }
54       }
55    }
这个例子改自:c#3.0 高级编程