任何人都可以向我解释IEnumerable和IEnumerator吗?
例如,什么时候在foreach上使用它?IEnumerable和IEnumerator之间有什么区别?为什么我们需要使用它?
免责声明:我明白之间的差别IEnumerable<T>
,并 IEnumerator<T>
和如何使用这两种.这与此或此不重复.
这更像是一个设计问题 - 因为IEnumerator<T>
已经封装了可以枚举的所有必要信息(.Current
,.MoveNext()
),那么引入一个type(IEnumerable<T>
)的目的是什么呢?它的唯一目的是返回前者的实例?
再具体一点:
为什么不能foreach
设计为直接迭代IEnumerator<T>
,如下所示:
// foreach (var e in anEnumerator) { //... }
while (anEnumerator.MoveNext())
{
doSomething(anEnumerator.Current);
}
Run Code Online (Sandbox Code Playgroud)为什么不能直接建立Linq IEnumerator<T>
?
我正在准备我的C#EXAM.我对这个问题的答案感到困惑:
程序可以使用
IEnumerable
和IEnumerator
接口来执行以下哪项操作?一个.使用MoveNext和Reset来移动对象列表.
湾 使用foreach移动对象列表.
C.按索引移动对象列表.
d.使用yield return语句创建迭代对象列表.
我的回答是b).但是这本书:MCSD认证工具包说它是a).
有人可以告诉我为什么吗?我意识到你可以获得Enumerator
使用GetEnumerator()
然后调用MoveNext
和Reset
方法来遍历列表(并用于Current
访问迭代器引用的当前元素).但是没有实现IEnumerable
和IEnumerator
在foreach
循环中使用对象的原因?
这是相当长一段时间,我一直在试图了解背后的想法IEnumerable
和IEnumerator
.我阅读了网上可以找到的所有问题和答案,特别是StackOverflow,但我并不满意.我明白了我应该如何使用这些接口,但不是为什么这样使用它们.
我认为我误解的本质是我们需要两个接口进行一次操作.我意识到,如果两者都需要,可能还不够.所以我采用了"硬编码"等价物foreach
(正如我在这里找到的):
while (enumerator.MoveNext())
{
object item = enumerator.Current;
// logic
}
Run Code Online (Sandbox Code Playgroud)
并试图让它与一个界面一起工作,认为某些事情会出错,这将使我理解为什么需要另一个界面.
所以我创建了一个集合类,并实现了IForeachable
:
class Collection : IForeachable
{
private int[] array = { 1, 2, 3, 4, 5 };
private int index = -1;
public int Current => array[index];
public bool MoveNext()
{
if (index < array.Length - 1)
{
index++;
return true;
}
index = -1;
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
并使用foreach …