IEnumerable背后的理由是什么?

时间:2008-11-30 16:51:16

标签: c# .net

为什么你认为微软希望我们通过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");
}

4 个答案:

答案 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;

如果“当前位置”存储在列表对象中,则内部和外部循环将在同一位置进行争用以存储其当前位置。据推测,内循环将运行一次,然后外循环将退出,发现自己已超过列表的末尾。