C# 迭代器 与迭代集合

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/heisenberg_kitty/article/details/89849472

C#中迭代器用法

C#中迭代器有两种
其用法为:
  (1) IEnumerator () ,返回类型为IEnumerator。用于对类本身的迭代,即在对象实例化时就完成迭代,不需要调用迭代方法;
  (2) IEnumerable ,返回类型为IEnumerable。用于对类成员的迭代,例如方法 Reverse() ,需要单独调用迭代方法才能实现迭代。
  对迭代的理解:由于迭代会生成一个数组,比如{ “A”, “B”, “C” },使用迭代不需要事先初始化一个确定大小的数组,而可以直接使用 foreach() 循环。如果想要对某一类型使用foreach,必须先实现IEnumerable接口,因为foreach的基本操作是没有类型的object。

1.简单迭代器

Letters class:

public class Letters
{
	 string[] letters = new string[] { "A", "B", "C" };
	 // 对类进行顺序迭代
	 public IEnumerator<string> GetEnumerator()  
	 {
	     for (int i = 0; i < 3; i++)
	     {
	         yield return letters[i];
	     }
	 }
	 // 使用Reverse()方法 逆序迭代
	 public IEnumerable<string> Reverse()
	 {
	     for (int i = 3; i >= 0; i--)
	     {
	         yield return letters[i];
	     }
	 }
}

主函数:

static void Main(string[] args)
{
    Letters myLetters = new Letters();
    WriteLine("The ordered letters:");
    foreach (var a in myLetters)
    {
        WriteLine(a);
    }
    WriteLine("The reversed letters:");
    foreach(var b in myLetters.Reverse())
    {
        WriteLine(b);
    }
    ReadKey();
    //输出结果:
    The ordered letters:
    A
    B
    C
    The reversed letters:
    C
    B
    A
}

2.高级用法

2.1 类迭代

  在类的构造函数中使用 泛型接口IEnumerable能够直接对类进行迭代。如果未先进行迭代将不能使用强化类型(即指定Animal类)的 foreach 循环。

public class Farm3:List<Animal>
{
    public Farm3() { }
    public Farm3(IEnumerable<Animal> initialItems)
    {
        foreach (Animal animal in initialItems)
        {   // Add()方法来自于List<Animal>基类
            this.Add(animal);
            // this 用法请看本人博客 C#关键字_访问关键字_this_&_base
        }
    }
    // 类自身迭代后就可以使用 类型为Animal的foreach循环
    public void MakeNoises()
    {
        foreach (Animal animal in this)
        {
            animal.MakeNoise();
        }
    }
}
2.2 IEnumerable <T >泛型接口的迭代器

  对于IEnumerable<T>接口 有一个方法GetEnumerator()需要实现,由于IEnumerable<T>继承于IEnumerable,因此总共需要实现两个GetEnumerator()方法:

public IEnumerator<T> GetEnumerator() => animals.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => animals.GetEnumerator();

实现代码:

public class Farm<T> :IEnumerable<T>  where T : Animal
{  
    // 由于泛型类 用于强类型化的集合,因此必须实例化才能进行集合的添加。
    private List<T> animals = new List<T>();
    public List<T> Animals
    {
        get { return animals; }
    }
    //                                               GetEnumerator()是 List<T>.Enumeraor List<T>.GetEnumerator()
    public IEnumerator<T> GetEnumerator() => animals.GetEnumerator();
    IEnumerator IEnumerable.GetEnumerator() => animals.GetEnumerator();
}

  使用private List<T> animals = new List<T>();是由于List<T>提供了Add()方法,同时也提供了大量其他方法,这时List<T>较CollectionBase基类更加方便的原因。
  如果未使用则将animals字段换为 this 即可。

  欢迎批评指正!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值