C#-迭代器/枚举器,索引器

1.迭代器:可使用Foreach遍历,如List,Dictionary等,其继承IEnumerable接口,并实现public IEnumerator GetEnumerator()方法;

举例:有个动物园,其中有各种动物:

public class Zoo : IEnumerable
{
    List<Animal> animals;
    public Zoo()
    {
        animals = new List<Animal>();
    }
    public void Add(Animal ani) { animals.Add(ani); }
    public IEnumerator GetEnumerator()//返回迭代器
    {
        foreach (var v in animals)
            yield return v;
    }
}

或这种实现方式:

public class Zoo : IEnumerable
{
    Enumerator enumer;
    List<Animal> animals;
    public Zoo()
    {
        animals = new List<Animal>();
        enumer = new Enumerator(this);
    }
    public void Add(Animal ani) { animals.Add(ani); }
    public IEnumerator GetEnumerator()//返回迭代器
    {
        return enumer;
    }
    public class Enumerator : IEnumerator
    {
        Zoo zoo;
        int index;
        public Enumerator(Zoo z)
        {
            zoo = z;
            index = -1;
        }

        public object Current
        {
            get { return zoo.animals[index]; }
        }

        public bool MoveNext()
        {
            return ++index < zoo.animals.Count;
        }

        public void Reset()
        {
            index = -1;
        }
    }
}

2.索引器,可以直接指定[Index]对对象中的元素进行读取或赋值

public Animal this[int index]//索引器
{
    get
    {
        if (animals.Count > index)
            return animals[index];
        return null;
    }
    set
    {
        if (animals.Count > index)
            animals[index] = value;
    }
}

使用迭代器和索引器:

Zoo zoo = new Zoo();
zoo.Add(new Animal("Cat"));
zoo.Add(new Animal("Dog"));
zoo.Add(new Animal("Pig"));
zoo.Add(new Animal("Duck"));
zoo[2] = new Animal("Cattle");
Console.WriteLine(zoo[3].name);//索引器,可指定Index进行赋值或读值
foreach (Animal v in zoo)
    Console.WriteLine(v.name);//迭代器,使用Foreach进行遍历

运行结果

 

  

  

  

  

posted @ 2023-05-20 11:31  [春风十里]  阅读(74)  评论(0编辑  收藏  举报