C# 什么';IEnumerable背后的理由是什么?

C# 什么';IEnumerable背后的理由是什么?,c#,.net,C#,.net,你认为微软为什么要我们通过IEnumerable找到IEnumerator?对于给定类型,是否存在对IEnumerator的有效强制转换足以确定该类型是否可枚举 例如,下面的问题是什么 class MyClass : IEnumerator { ... } MyClass myObj = new MyClass(); if(myObj as IEnumerator != null) { Console.WriteLine("myObj is enumerable"); } e

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

您可能有两个线程正在枚举-每个线程都需要自己的枚举器


IEnumerable.GetEnumerator返回最初位于集合第一个元素之前的枚举数。如果您只有IEnumerator,那么即使在单线程的情况下,您也必须记住在使用它之前重置自己。

您可能有两个线程正在枚举-每个线程都需要自己的枚举器


IEnumerable.GetEnumerator返回最初位于集合第一个元素之前的枚举数。如果您只有IEnumerator,即使在单线程的情况下,您也必须记住在使用它之前重置自己。

IEnumerator保存执行枚举所需的状态信息,如数组索引等

枚举状态信息不是可枚举对象的一部分,因此强制转换功能不够强大


此外,枚举数/可枚举数分离允许在同一个可枚举集合上同时执行多个枚举。

IEnumerator保存执行枚举所需的状态信息,如数组索引等

枚举状态信息不是可枚举对象的一部分,因此强制转换功能不够强大


此外,枚举数/可枚举数分离允许在同一个可枚举集合上同时执行多个枚举。

这是一个职责分离的问题,IEnumerable是一个可以迭代的类。IEnumerable是一个进行迭代的类。

这是一个职责分离的问题,IEnumerable是一个可以迭代的类。IEnumerator是一个进行迭代的类。

公认的答案是关于多线程的,但单线程算法也会受到严重限制。记住将列表重置为起始位置对foreach来说不是问题,但假设您希望将列表中的每个项目与其他项目进行比较:

int matchCount = 0;

foreach (var x in myList)
{
    foreach (var y in myList)
    {
        if (x == y)
            matchCount++;
    }
}

matchCount /= 2;

如果“当前位置”存储在列表对象中,则内部和外部循环都将争夺同一位置以存储其当前位置。假设内部循环运行一次,然后外部循环退出,因为它发现自己已经超过了列表的末尾。

公认的答案是关于多线程的,但是单线程算法也会受到严重限制。记住将列表重置为起始位置对foreach来说不是问题,但假设您希望将列表中的每个项目与其他项目进行比较:

int matchCount = 0;

foreach (var x in myList)
{
    foreach (var y in myList)
    {
        if (x == y)
            matchCount++;
    }
}

matchCount /= 2;

如果“当前位置”存储在列表对象中,则内部和外部循环都将争夺同一位置以存储其当前位置。假设内部循环将运行一次,然后外部循环将退出,因为它发现自己已经超过了列表的末尾。

好的,这似乎是一个有效的理由,但这是解决多个并发枚举客户端问题的最佳/唯一解决方案吗?这是这样做的一个好处,但主要关注的是分离状态和数据。正如我在回复中提到的,请看我对你文章的评论。状态和数据不能总是分开的,即使您非常想要它。除此之外,这里的状态和数据是一样的。数据是另一个对象的状态。好吧,这似乎是一个有效的理由,但这是解决多个并发枚举客户端问题的最佳/唯一解决方案吗?这是这样做的一个好处,但主要关注的是分离状态和数据。正如我在回复中提到的,请看我对你文章的评论。状态和数据不能总是分开的,即使您非常想要它。除此之外,这里的状态和数据是一样的。数据是另一个对象的状态。我看不出责任实际上是如何分离的。一个无法访问另一个类的内部细节的类真的可以在没有可枚举类帮助的情况下枚举它的元素吗?一种基本的方法是使用内部类(类型),但这并不是我所说的分离。实现可能不可分离,但接口可以分离,看看STL迭代器,虽然每个容器都有一个迭代器,但迭代器接口独立于实现。在您的示例中,类可以返回枚举数而不必是枚举器SDX:考虑如何实现列表的IQueRealTor。考虑到您知道项目的大小,并且可以通过索引获取项目,这很容易!检测更改将是一个棘手的问题,但除此之外,它很简单。@Jon:IMHO一个列表可以被索引访问的事实使得它可以枚举,即使它没有实现IEnumerable。这就是我所说的“没有可枚举类的任何帮助”的意思。被枚举的类总是以某种方式成为枚举器。我看不出责任实际上是如何分离的。一个无法访问另一个类的内部细节的类真的可以在没有可枚举类帮助的情况下枚举它的元素吗?一种基本的方法是使用内部类(类型),但这并不是我所说的分离。实现可能不可分离,但接口可以分离,看看STL迭代器,虽然每个容器都有一个迭代器,但迭代器接口独立于实现。在您的示例中,类可以返回枚举数而不必是枚举器SDX:考虑如何实现列表的IQueRealTor。考虑到您知道项目的大小,并且可以通过索引获取项目,这很容易!检测变化将是一个棘手的问题,b