C#中,GetEnumerator()
是IEnumerable
下面是GetEnumerator()
方法的详细解释:
1.方法签名
IEnumerator<T> GetEnumerator();
2.返回值
返回一个实现IEnumerator
3.方法作用
GetEnumerator()
方法返回一个实现IEnumerator
4.方法详解
IEnumeratorMoveNext()
和 Reset()
。在GetEnumerator()
方法中,我们需要创建并返回一个实现IEnumerator
MoveNext()
方法用于将迭代器指向集合中的下一个元素。当返回 true
时,迭代器指向下一个元素;当返回 false
时,迭代器已经指向了集合的末尾。
Reset()
方法用于将迭代器重置到集合的开头。
下面是一个实现IEnumerable
public class MyCollection<T> : IEnumerable<T>
{
private List<T> list;
public MyCollection(List<T> list)
{
this.list = list;
}
public IEnumerator<T> GetEnumerator()
{
return new MyEnumerator<T>(list);
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
public class MyEnumerator<T> : IEnumerator<T>
{
private List<T> list;
private int currentIndex = -1;
public MyEnumerator(List<T> list)
{
this.list = list;
}
public T Current
{
get
{
try
{
return list[currentIndex];
}
catch (IndexOutOfRangeException)
{
throw new InvalidOperationException();
}
}
}
object IEnumerator.Current => Current;
public bool MoveNext()
{
currentIndex++;
return (currentIndex < list.Count);
}
public void Reset()
{
currentIndex = -1;
}
public void Dispose()
{
currentIndex = -1;
}
}
在上面的示例中,我们创建了一个自定义的集合MyCollection<T>
,它实现了IEnumerableGetEnumerator()
方法中,我们返回了一个实现IEnumeratorMyEnumerator<T>
。
下面是一个使用MyCollection
List<int> list = new List<int>() { 1, 2, 3, 4, 5 };
MyCollection<int> collection = new MyCollection<int>(list);
foreach (int item in collection)
{
Console.WriteLine(item);
}
以上面的示例为例,输出结果如下:
1
2
3
4
5
另一个简单的示例是使用yield
语句返回一个实现IEnumerator<T>
接口的迭代器:
public class MyCollection<T> : IEnumerable<T>
{
private List<T> list;
public MyCollection(List<T> list)
{
this.list = list;
}
public IEnumerator<T> GetEnumerator()
{
foreach (T item in list)
{
yield return item;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
这个示例中没有使用自定义的迭代器类,而是使用了yield
语句返回一个实现IEnumerator<T>
接口的迭代器。在调用GetEnumerator()
方法时,会返回一个迭代器对象,通过这个迭代器对象,我们可以遍历集合中的元素。
总的来说,通过以上的介绍,我们可以清楚的了解到GetEnumerator()
方法在C#中的充要条件及作用。