版权声明:本文为博主原创文章,未经博主允许不得转载。 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 即可。
欢迎批评指正!!!