自定义类实现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


浙公网安备 33010602011771号