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


浙公网安备 33010602011771号