IEnumerable和IEnumerator

     我们写一些实体类的时候,总希望它们可以进行foreach遍历,但是默认的是不能进行foreach遍历。

     假如我有一个汽车类和一个汽车工厂类见下面代码:

 

public class Car
    {
        
private string _name;

        
public string Name
        {
            
get
            {
                
return _name;
            }
            
set
            {
                _name 
= value;
            }
        }

        
public Car(string name)
        {
            _name 
= name;
        }
    }

    
public class CarFactory
    {
        
private Car[] carArry;

        
public CarFactory()
        {
            carArry 
= new Car[2];
            carArry[
0= new Car("carA");
            carArry[
1= new Car("carB");
        }
    }

 

      然后在客户端进行使用

 

static void Main(string[] args)
        {
            CarFactory carFactory 
= new CarFactory();

            
foreach (Car c in carFactory)
            {
                Console.WriteLine(c.Name);
            }
        }

 

      现在你会发现编译器通不过,会提示一个这样的错误:

“错误 1 “ConsoleApplication1.CarFactory”不包含“GetEnumerator”的公共定义,因此 foreach 语句不能作用于“ConsoleApplication1.CarFactory”类型的变量 D:\VS2008\Test\ConsoleApplication1\ConsoleApplication1\Program.cs 14 13 ConsoleApplication1”

      它提示说我们的类中没有实现GetEnumerator方法。

      这时我们只需要把我们的CarFactory类实现IEnumerable接口就可以了,见下面代码:

     

 public class CarFactory:IEnumerable
    {
        
private Car[] carArry;

        
public CarFactory()
        {
            carArry 
= new Car[2];
            carArry[
0= new Car("carA");
            carArry[
1= new Car("carB");
        }

        
#region IEnumerable 成员

        
public IEnumerator GetEnumerator()
        {
            
return carArry.GetEnumerator();
        }

        
#endregion
    }

 

      或者可以用另一种方法,就是不实现IEnumerable接口,而是我们自己写一个名字为GetEnumerator并且返回类型为IEnumerator的方法

 

Code

 

     这样也可以达到同样的效果。

     还有就是IEnumerable和IEnumerator的命名空间是:System.Collections; MSDN对yield的官方解释是“在迭代器块中用于向枚举数对象提供值或发出迭代结束信号。”,我看的不是太明白,因为明早还要上课,现在没时间深究了,哪位朋友可以在这里指点一下,小弟先谢过了。

     参考书:《C#与.Net3.0高级程序设计》

posted @ 2009-03-11 00:38  百利  阅读(1106)  评论(1编辑  收藏  举报