为什么你认为微软希望我们通过IEnumerable来获取IEnumerator? IEnumerator是否存在对某个类型的有效强制转换,以确定该类型是否可枚举?
例如,以下哪个错误?
class MyClass : IEnumerator
{
...
}
MyClass myObj = new MyClass();
if(myObj as IEnumerator != null)
{
Console.WriteLine("myObj is enumerable");
}
else
{
Console.WriteLine("myObj doesn't support enumeration");
}
答案 0 :(得分:10)
您可能有两个枚举的线程 - 每个线程都需要自己的枚举器。
IEnumerable.GetEnumerator返回一个最初位于集合的第一个元素之前的枚举数。如果你只有IEnumerator,你必须记住在使用之前重置自己,即使在单线程场景中也是如此。
答案 1 :(得分:5)
IEnumerator保存执行枚举所需的状态信息,例如数组索引等。
枚举状态信息不是可枚举对象的一部分,因此强制转换不够强大。
此外,枚举器/可枚举分离允许在同一个可枚举集合上同时执行多个枚举。
答案 2 :(得分:1)
这是一个分离职责的问题,IEnumerable是一个可以在IEnumerator上迭代的类是一个进行迭代的类。
答案 3 :(得分:1)
接受的答案涉及多线程,但单线程算法也会受到严重限制。记住将列表重置为开头并不是foreach帮助您的问题,但是假设您想要将列表中的每个项目与其他项目进行比较:
int matchCount = 0;
foreach (var x in myList)
{
foreach (var y in myList)
{
if (x == y)
matchCount++;
}
}
matchCount /= 2;
如果“当前位置”存储在列表对象中,则内部和外部循环将在同一位置进行争用以存储其当前位置。据推测,内循环将运行一次,然后外循环将退出,发现自己已超过列表的末尾。