我有一个foreach需要转换为foror循环的while循环。我的循环如下所示:
foreach (Item item in Items)
{
    // some stuff
}
什么是等价物for或while循环?
我想我需要使用GetEnumerator来获得一个IEnumerator<Item>,但我不知道如何正确使用它。Items不是列表,否则我会使用索引。
我有一个foreach需要转换为foror循环的while循环。我的循环如下所示:
foreach (Item item in Items)
{
    // some stuff
}
什么是等价物for或while循环?
我想我需要使用GetEnumerator来获得一个IEnumerator<Item>,但我不知道如何正确使用它。Items不是列表,否则我会使用索引。
在最简单的情况下(不处置等),您可以使用:
var enumerator = Items.GetEnumerator();// `var` to take advantage of more specific return type
while(enumerator.MoveNext())
{
  Item item = enumerator.Current;
  ...
}
有关确切的规则,请查看 C# 规范 8.8.4 The foreach 语句。
形式的 foreach 语句
foreach (V v in x) embedded-statement然后扩展为:
{ E e = ((C)(x)).GetEnumerator(); try { V v; while (e.MoveNext()) { v = (V)(T)e.Current; embedded-statement } } finally { … // Dispose e }}
(引自 C# 语言规范 4.0 版)
这里使用的类型是:“集合类型C、枚举类型E和元素类型T”。E是 的返回类型GetEnumerator,并且不一定IEnumerator<V>因为foreach使用鸭子类型。该规范还描述了一些极端情况以及如何推断这些类型,但这些细节可能与这里无关。
在 C# 5 中, 的声明v将被移到while循环中以获得更直观的闭包语义。
如果要使用for循环,通常意味着有某种方法可以快速访问第 n 个项目(通常是索引器)。  
for(int i = 0; i < Items.Count; i++)
{
  Item item = Items[i]; //or Items.Get(i) or whatever method is relevant.
  //...
}
如果您只是要访问迭代器,您通常只想使用foreach循环。但是,如果您不能,这通常是有意义的模型:
using(IEnumerator<Item> iterator = Items.GetEnumerator())
while(iterator.MoveNext())
{
  Item item = iterator.Current;
  //do stuff
}
从技术上讲,您可以在for循环中执行此操作,但这会更难,因为该构造与这种格式不太一致。如果您要讨论不能使用foreach循环的原因,我们可能会帮助您找到最佳解决方案,无论是否涉及使用for循环。
这是 for 循环中的等价物
for (IEnumerator i = Items.GetEnumerator(); i.MoveNext(); )
{
    Item item = (Item)i.Current;
    // some stuff
}