IEnumerable和IEnumerable<T>接口
IEnumerable和IEnumerable<T>接口在.NET中是非常重要的接口,它允许开发人员定义foreach语句功能的实现并支持非泛型方法的简单迭代,IEnumerable和IEnumerable<T>接口是.NET Framework中最基本的集合访问器,这两个接口对于LINQ的理解是非常重要的。在面向对象的开发过程中,常常需要创建若干对象,并进行对象的操作和查询,在创建对象前,首先需要声明一个类为对象提供描述,示例代码如下:
- using System;
- using System.Collections.Generic;
- using System.Linq; //使用LINQ命名控件
- using System.Text;
- namespace IEnumeratorSample
- //定义一个Person类
- class Person
- {
- public string Name; //定义
Person的名字- public string Age; //定
义Person的年龄- public Person(string name, string age) //
为Person初始化(构造函数)- {
- Name = name; //配置Name值
- Age = age; //配置Age值
- }
- }
上述代码定义了一个Person类并抽象了Person类的属性,这些属性包括Name和Age。Name和Age属性分别用于描述Person的名字和年龄,用于数据初始化。初始化之后的数据就需要创建一系列Person对象,通过这些对象的相应属性能够进行对象的访问和遍历,示例代码如下:
- class Program
- {
- static void Main(string[] args)
- {
- Person[] per = new Person[2] //创
建并初始化2个Person对象- {
- new Person("guojing","21"), //通过构造函数构造对象
- new Person("muqing","21"), //通过构造函数构造对象
- };
- foreach (Person p in per) //遍历对象
- Console.WriteLine("Name is " + p.Name +
" and Age is " + p.Age);- Console.ReadKey();
- }
- }
- }
上述代码创建并初始化了两个Person对象,并通过foreach语法进行对象的遍历。但是,上述代码是在数组中进行查询的,就是说,如果要创建多个对象,则必须创建一个对象数组,如上述代码中的Per变量,而如果需要直接对对象的集合进行查询,则不能够实现查询功能。例如增加一个构造函数,该构造函数用户构造一组Person对象,示例代码如下:
- private Person[] per;
- public Person(Person[] array)
- {//重载构造函数,迭代对象
- per = new Person[array.Length]; //创建对象
- for (int i = 0; i < array.Length; i++) //遍历初始化对象
- {
- per[i] = array[i]; //数组赋值
- }
- }
上述构造函数动态的构造了一组People类的对象,那么应该也能够使用foreach语句进行遍历,示例代码如下:
- Person personlist = new Person(per); //创建对象
- foreach (Person p in personlist) //遍历对象
- {
- Console.WriteLine("Name is " + p.Name + " and Age is " + p.Age);
- }
在上述代码的foreach语句中,直接在Person类的集合中进行查询,系统则会报错"ConsoleApplication1.Person"不包含"GetEnumerator"的公共定义,因此,foreach语句不能作用于"ConsoleApplication1.Person"类型的变量,因为Person类并不支持foreach语句进行遍历。为了让相应的类能够支持foreach语句执行遍历操作,则需要实现IEnumerable接口,示例代码如下:
- public IEnumerator GetEnumerator() //实现接口中的方法
- {
- return new GetEnum(_people);
- }
为了让自定义类型能够支持foreach语句,必须对Person类的构造函数进行编写并实现接口,示例代码如下:
- class Person:IEnumerable //派
生自IEnumerable,同样定义一个Personl类- {
- public string Name; //创建字段
- public string Age; //创建字段
- public Person(string name, string age) //字段初始化
- {
- Name = name; //配置Name值
- Age = age; //配置Age值
- }
- public IEnumerator GetEnumerator() //实现接口
- {
- return new PersonEnum(per); //返回方法
- }