我有一个foreach
循环,需要转换为for
或while
循环。我的循环看起来像这样:
foreach (Item item in Items)
{
// some stuff
}
等效的for
或while
循环是什么?
我想我需要使用GetEnumerator
来获取IEnumerator<Item>
,但我不知道如何正确使用它。 Items
不是列表,否则我会使用索引。
答案 0 :(得分:20)
在最简单的情况下(不处理等),您可以使用:
var enumerator = Items.GetEnumerator();// `var` to take advantage of more specific return type
while(enumerator.MoveNext())
{
Item item = enumerator.Current;
...
}
对于确切的规则,请检查C#规范8.8.4 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
使用了duck类型。该规范还描述了许多极端情况以及如何推断这些类型,但这些细节可能与此无关。
在C#5中,v
的声明将被移入while
循环,以获得更直观的闭包语义。
答案 1 :(得分:4)
如果您要使用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
循环。
答案 2 :(得分:2)
这是for-loop
中的等价物for (IEnumerator i = Items.GetEnumerator(); i.MoveNext(); )
{
Item item = (Item)i.Current;
// some stuff
}