在C#中,自定义遍历器需要实现IEnumerable接口和IEnumerator接口。其中,IEnumerable接口包含一个GetEnumerator方法,该方法返回一个IEnumerator接口的实例,而IEnumerator接口包含Current、MoveNext和Reset方法。
IEnumerable:IEnumerable是一个接口,它代表一个可以迭代的集合。这意味着可以使用IEnumerator:foreach循环遍历IEnumerable对象中的元素。
在C#中,
IEnumerator
是.NET框架中的一个接口,它用于在集合中遍历元素。这个接口通常与使用foreach
循环来遍历集合的代码一起使用。
IEnumerator
接口定义了两个主要的方法:MoveNext()
和Reset()
。
MoveNext()
方法用于将迭代器移动到集合中的下一个元素。如果集合中没有更多的元素,则该方法将返回false
。Reset()
方法用于重置迭代器,使其重新回到集合的起始位置。此外,
IEnumerator
接口还定义了一个Current
属性,它返回当前迭代器位置的元素。
一、yield关键字生成迭代器
cs
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
foreach (int number in GetNumbers())
{
Console.WriteLine(number);
}
}
static IEnumerable<int> GetNumbers()
{
for (int i = 0; i < 10; i++)
{
yield return i;
}
}
}
只有IEnumerable才能通过foreach被遍历。
二、关于**IEnumerator的用法示例
**
cs
List<string> fruits = new List<string> { "Apple", "Banana", "Cherry" };
IEnumerator enumerator = fruits.GetEnumerator();
while (enumerator.MoveNext())
{
string fruit = (string)enumerator.Current;
Console.WriteLine(fruit);
}
通过这个例子可以看出来 IEnumerable是一个可以迭代的集合,而**IEnumerator是定义foreach迭代器。
**
三、自定义一可以遍历的类
cs
public class Program
{
static void Main(string[] args)
{
student st = new student();
st.add(2);
st.add(3);
st.add(100);
foreach (var item in st)
{
Console.WriteLine(item);
}
Console.Read();
}
}
public class student : IEnumerable, IEnumerator
{
private List<int> _data;
private int position = -1;
private List<int> data = new List<int>();
public student()
{
}
public student(List<int> data)
{
this._data = data;
}
public object Current => _data[position];
public void add(int num)
{
data.Add(num);
}
public IEnumerator GetEnumerator()
{
return new student(data);
}
public bool MoveNext()
{
position++;
return position < _data.Count;
}
public void Reset()
{
position = -1;
}
}
代码2
cs
using System;
using System.Collections;
public class MyList : IEnumerable
{
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
{
get
{
return data[position];
}
}
public bool MoveNext()
{
position++;
return (position < data.Length);
}
public void Reset()
{
position = -1;
}
}
// 使用自定义遍历器
class Program
{
static void Main(string[] args)
{
MyList list = new MyList();
foreach (int i in list)
{
Console.WriteLine(i);
}
}
}