自定义类实现foreach遍历

MS提供了foreach关键字,与for相比在遍历集合元素的性能上得到了极大的提高,所以很多时候我们在遍历数组和集合对象的时候选择了foreach。
然而有部分朋友并不知道foreach在什么时候能用,举个例子:

string[] arg=new string[5];
foreach(string str in arg)
{
    Console.writeLine(str);
}

为什么string类型的数组对象能够用foreach遍历呢?答案是:数组类型都是从System.Array继承来的,Array是一个abstract class,并且它继承了 IEnumerable接口,而这个接口里面有一个方法IEnumerator GetEnumerator(),返回一个循环访问集合的枚举器,返回的类型是IEnumerator。

下面我们来看一个自定义的类怎么来实现foreach。

View Code
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Collections;
 6 
 7 namespace 类对象实现Foreach
 8 {
 9     public class Person
10     {
11         public string Name { get; set; }
12         public string Sex { get; set; }
13         public Person(string name, string sex)
14         {
15             this.Name = name;
16             this.Sex = sex;
17         }
18     }
19     public class Persons : IEnumerator, IEnumerable//其实IEnumerable借口实不实现无所谓,关键是要实现IEnumerator GetEnumerator();方法
20     {
21         int position = -1;
22         private Person[] _PersonList;
23         public Persons(Person[] PersonList)
24         {
25             this._PersonList = PersonList;
26             
27         }
28         //所有的接口都默认是public   方法,所以它的实现类方法必须声明为public   。 
29         //以下Current属性和MoveNext、Reset方法都是IEnumerator借口定义的,所以实现的修饰符一定得用Public
30         public object Current
31         {
32             get { return _PersonList[position]; }//集合中的当前元素。
33         }
34         public bool MoveNext()
35         {
36             position++;
37             return (position < _PersonList.Length);
38         }
39         public void Reset()
40         {
41             position = -1;
42         }
43         //GetEnumerator方法的作用是获取枚举数(返回值是IEnumerator类型的,就是枚举数的类型)
44         //使用foreach语句类必须提供GetEnumerator方法获取该类的枚举数,然后编译器通过这个枚举数来调用IEnumerator接口里
45         //的 MoveNext、Reset方法和Current属性实现对类元素的遍历。
46         public IEnumerator GetEnumerator()
47         {
48             return this;//返回的是当前的Persons对象
49         }
50     }
51     class Program
52     {
53         //要让Persons类实现foreach
54         static void Main(string[] args)
55         {
56             Person[] Persons = new Person[] {
57             new Person("aa","1"),
58             new Person("bb","2"),
59             new Person("cc","3"),
60             new Person("dd","4"),
61             };
62             Persons PL = new Persons(Persons);
63             foreach (Person P in PL)
64             { 
65                 Console.WriteLine("姓名:{0},性别:{1}",P.Name,P.Sex);
66             }
67             Console.ReadKey();
68         }
69     }
70 }

运行的结果如下:

我们一般都用foreach来读取对象,如果用来修改对象会出现错误,例如:

int[] arr = new int[] { 1,2,3,4,5};
            foreach (int i in arr)
            {
               // Console.Write(i+",");
                i += 3;//这里IDE会提示错误信息:i是一个foreach迭代变量,无法给它赋值。
            }

  但是我们可以Add或者Remove arr中的对象。

这篇随笔参考了CSDN上的一篇博客,地址是http://blog.csdn.net/jxchenjh/article/details/3202585

posted @ 2012-09-24 23:13  SKY_LEO  阅读(533)  评论(0)    收藏  举报