C#中,使用foreach循环遍历访问的对象需要实现IEnumerable接口或者声明GetEnumerator方法的类型。
- 实现IEnumerable接口:IEnumerable接口定义了一个GetEnumerator方法,该方法返回一个实现了IEnumerator接口的对象。通过实现IEnumerable接口,可以使对象能够被foreach循环遍历访问。
示例代码如下:
public class MyCollection : IEnumerable
{private int[] data = { 1, 2, 3, 4, 5 };public IEnumerator GetEnumerator(){return data.GetEnumerator();}
}// 使用foreach循环遍历访问MyCollection对象
MyCollection collection = new MyCollection();
foreach (int item in collection)
{Console.WriteLine(item);
}
- 声明GetEnumerator方法:如果一个类型没有实现IEnumerable接口,但是声明了GetEnumerator方法,该方法返回一个实现了IEnumerator接口的对象,同样可以使对象能够被foreach循环遍历访问。
示例代码如下:
public class MyCollection
{private int[] data = { 1, 2, 3, 4, 5 };public IEnumerator GetEnumerator(){return new MyEnumerator(data);}
}public class MyEnumerator : IEnumerator
{private int[] data;private int position = -1;public MyEnumerator(int[] data){this.data = data;}public object Current => data[position];public bool MoveNext(){position++;return position < data.Length;}public void Reset(){position = -1;}
}// 使用foreach循环遍历访问MyCollection对象
MyCollection collection = new MyCollection();
foreach (int item in collection)
{Console.WriteLine(item);
}