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进行遍历
运行结果