IEnumerable和IEnumerable T接口

IEnumerable和IEnumerable<T>接口

IEnumerable和IEnumerable<T>接口在.NET中是非常重要的接口,它允许开发人员定义foreach语句功能的实现并支持非泛型方法的简单迭代,IEnumerable和IEnumerable<T>接口是.NET Framework中最基本的集合访问器,这两个接口对于LINQ的理解是非常重要的。在面向对象的开发过程中,常常需要创建若干对象,并进行对象的操作和查询,在创建对象前,首先需要声明一个类为对象提供描述,示例代码如下:

 
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;              //使用LINQ命名控件  
  4. using System.Text;  
  5. namespace IEnumeratorSample  
  6. //定义一个Person类  
  7.            class Person  
  8.          {  
  9.              public string Name;                 //定义
    Person的名字  
  10.                   public string Age;                //定
    义Person的年龄  
  11.              public Person(string name, string age) //
    为Person初始化(构造函数)  
  12.              {  
  13. Name = name;                //配置Name值  
  14.                       Age = age;                    //配置Age值  
  15.                 }  
  16.          } 

上述代码定义了一个Person类并抽象了Person类的属性,这些属性包括Name和Age。Name和Age属性分别用于描述Person的名字和年龄,用于数据初始化。初始化之后的数据就需要创建一系列Person对象,通过这些对象的相应属性能够进行对象的访问和遍历,示例代码如下:

 
 
  1.     class Program  
  2.     {  
  3.         static void Main(string[] args)  
  4.         {  
  5.             Person[] per = new Person[2]            //创
    建并初始化2个Person对象  
  6.             {  
  7.                 new Person("guojing","21"),     //通过构造函数构造对象  
  8.                 new Person("muqing","21"),      //通过构造函数构造对象  
  9.             };  
  10.             foreach (Person p in per)               //遍历对象  
  11.                 Console.WriteLine("Name is " + p.Name +
    " and Age is " + p.Age);  
  12.             Console.ReadKey();  
  13.         }  
  14.     }  

上述代码创建并初始化了两个Person对象,并通过foreach语法进行对象的遍历。但是,上述代码是在数组中进行查询的,就是说,如果要创建多个对象,则必须创建一个对象数组,如上述代码中的Per变量,而如果需要直接对对象的集合进行查询,则不能够实现查询功能。例如增加一个构造函数,该构造函数用户构造一组Person对象,示例代码如下:

 
 
  1. private Person[] per;  
  2. public Person(Person[] array)  
  3. {//重载构造函数,迭代对象  
  4.     per = new Person[array.Length];         //创建对象  
  5.     for (int i = 0; i < array.Length; i++)          //遍历初始化对象  
  6.     {  
  7.         per[i] = array[i];                      //数组赋值  
  8.     }  

上述构造函数动态的构造了一组People类的对象,那么应该也能够使用foreach语句进行遍历,示例代码如下:

 
 
  1. Person personlist = new Person(per);                //创建对象  
  2. foreach (Person p in personlist)                    //遍历对象  
  3. {  
  4.     Console.WriteLine("Name is " + p.Name + " and Age is " + p.Age);  

在上述代码的foreach语句中,直接在Person类的集合中进行查询,系统则会报错"ConsoleApplication1.Person"不包含"GetEnumerator"的公共定义,因此,foreach语句不能作用于"ConsoleApplication1.Person"类型的变量,因为Person类并不支持foreach语句进行遍历。为了让相应的类能够支持foreach语句执行遍历操作,则需要实现IEnumerable接口,示例代码如下:

 
 
  1. public IEnumerator GetEnumerator()                  //实现接口中的方法  
  2.     {  
  3.         return new GetEnum(_people);  
  4.     } 

为了让自定义类型能够支持foreach语句,必须对Person类的构造函数进行编写并实现接口,示例代码如下:

 
 
  1. class Person:IEnumerable                    //派
    生自IEnumerable,同样定义一个Personl类  
  2. {  
  3.     public string Name;                 //创建字段  
  4.     public string Age;                  //创建字段  
  5.     public Person(string name, string age)      //字段初始化  
  6.     {  
  7.         Name = name;                            //配置Name值  
  8.         Age = age;                              //配置Age值  
  9.     }  
  10.     public IEnumerator GetEnumerator()          //实现接口  
  11.     {  
  12.         return new PersonEnum(per);             //返回方法  
  13.     }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值