深入了解 C# 迭代器和列举器攻略
什么是迭代器和列举器
- 迭代器是一种访问集合中元素的方式,它不需要了解集合的内部结构。迭代器是一个对象,实现集合的 IEnumerable 接口,通过
GetEnumerator()
方法获取枚举器。 - 列举器是一个可枚举的对象,它通过实现 IEnumerator 接口,提供一种访问集合元素的方法。枚举器可以对集合进行前向和反向遍历,并获取当前位置和当前元素。
如何实现迭代器和列举器
实现迭代器
C# 中的迭代器使用 yield 语句来实现。以下是一个获取斐波那契数列的迭代器示例:
public class Fibonacci
{
public static IEnumerable<int> GetFibonacciSequence(int count)
{
int a = 0, b = 1;
for (int i = 0; i < count; i++)
{
int temp = a;
a = b;
b = temp + b;
yield return a;
}
}
}
在代码中,使用了 yield return 语句将当前的斐波那契数列值返回给调用者。每次调用 MoveNext() 方法时,代码会从 yield return 语句中恢复执行,然后再次暂停,直到下一次调用 MoveNext() 方法或遍历结束。
实现列举器
以下是一个实现枚举器的例子,该枚举器可用于对数组进行前向和反向遍历:
public class MyArray : IEnumerable
{
private int[] items = new int[10];
public MyArray()
{
for (int i = 0; i < 10; i++)
{
items[i] = i + 1;
}
}
public IEnumerator GetEnumerator()
{
return new MyEnumerator(items);
}
public class MyEnumerator : IEnumerator
{
private int[] items;
private int position = -1;
public MyEnumerator(int[] items)
{
this.items = items;
}
public object Current
{
get
{
return items[position];
}
}
public bool MoveNext()
{
if (position < items.Length - 1)
{
position++;
return true;
}
return false;
}
public void Reset()
{
position = -1;
}
}
}
在代码中,使用 GetEnumerator() 方法返回枚举器实例。然后枚举器实现了 IEnumerator 接口中的 MoveNext()、Reset() 和 Current 属性。在 GetEnumerator() 方法中创建了 MyEnumerator 类的实例,该类实现了枚举器的逻辑。
如何使用迭代器和列举器
以下是一个使用 Fibonacci 类和 MyArray 类的示例:
class Program
{
static void Main(string[] args)
{
// 使用迭代器获取斐波那契数列
foreach (int fib in Fibonacci.GetFibonacciSequence(10))
{
Console.WriteLine(fib);
}
// 使用枚举器遍历数组
MyArray myArray = new MyArray();
foreach (int item in myArray)
{
Console.WriteLine(item);
}
Console.ReadLine();
}
}
在代码中,使用 foreach 循环遍历斐波那契数列和数组元素,每次循环都会调用迭代器的 MoveNext() 方法或枚举器的 MoveNext() 方法,直到遍历结束为止。
总结
本文介绍了迭代器和枚举器的概念和实现方式,以及如何使用它们对集合进行遍历。迭代器和枚举器是 C# 语言中用于遍历集合的强大工具,能够提高代码的可读性和可维护性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入了解c# 迭代器和列举器 - Python技术站