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);
}