C#中實現列舉數

iDotNetSpace發表於2009-11-24

    我們知道在.net中有兩個介面用來實現列舉數的,它就是System.Collections 名稱空間 下的 IEnumerable和IEnumerator介面。簡單地說IEnumerator介面是用來實現列舉器,而IEnumerable介面是用來公開枚列舉器的。

     下面來看看MSDN上是怎麼說的。

     IEnumerator 介面
     支援對非泛型集合的簡單迭代。也就是列舉

     方法 
           MoveNext  將列舉數推進到集合的下一個元素。
           Reset  將列舉數設定為其初始位置,該位置位於集合中第一個元素之前。
     屬性
           Current  獲取集合中的當前元素。

    這個介面是用來實現列舉器的,如下程式碼

 

Code
 1public class PeopleEnum : IEnumerator
 2{
 3    public Person[] _people;
 4
 5    // Enumerators are positioned before the first element
 6    // until the first MoveNext() call.
 7    int position = -1;
 8
 9    public PeopleEnum(Person[] list)
10    {
11        _people = list;
12    }
13
14    public bool MoveNext()
15    {
16        position++;
17        return (position < _people.Length);
18    }
19
20    public void Reset()
21    {
22        position = -1;
23    }
24
25    public object Current
26    {
27        get
28        {
29            try
30            {
31                return _people[position];
32            }
33            catch (IndexOutOfRangeException)
34            {
35                throw new InvalidOperationException();
36            }
37        }
38    }
39}
40
上面是對IEnumerator介面的實現,現在有了一個PeopleEnum的列舉器,它用來列舉People物件。

那IEnumerable介面有什麼用了,它就是用來公開列舉器的。如下程式碼:

  方法
         GetEnumerator  返回一個迴圈訪問集合的列舉數。


Code
 1using System;
 2using System.Collections;
 3
 4public class Person
 5{
 6    public Person(string fName, string lName)
 7    {
 8        this.firstName = fName;
 9        this.lastName = lName;
10    }
11
12    public string firstName;
13    public string lastName;
14}
15
16public class People : IEnumerable
17{
18    private Person[] _people;
19    public People(Person[] pArray)
20    {
21        _people = new Person[pArray.Length];
22
23        for (int i = 0; i < pArray.Length; i++)
24        {
25            _people[i] = pArray[i];
26        }
27    }
28
29    public IEnumerator GetEnumerator()
30    {
31        return new PeopleEnum(_people);
32    }
33}
34
35public class PeopleEnum : IEnumerator
36{
37    public Person[] _people;
38
39    // Enumerators are positioned before the first element
40    // until the first MoveNext() call.
41    int position = -1;
42
43    public PeopleEnum(Person[] list)
44    {
45        _people = list;
46    }
47
48    public bool MoveNext()
49    {
50        position++;
51        return (position < _people.Length);
52    }
53
54    public void Reset()
55    {
56        position = -1;
57    }
58
59    public object Current
60    {
61        get
62        {
63            try
64            {
65                return _people[position];
66            }
67            catch (IndexOutOfRangeException)
68            {
69                throw new InvalidOperationException();
70            }
71        }
72    }
73}
74
75
這樣就可以用foreach語句訪問people類中的person物件。這也是一個疊代器設計模式

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-620407/,如需轉載,請註明出處,否則將追究法律責任。

相關文章