Ken*_*rey 10 .net c# ienumerable ienumerator foreach
我有一个foreach需要转换为for或while循环的循环.我的循环看起来像这样:
foreach (Item item in Items)
{
// some stuff
}
Run Code Online (Sandbox Code Playgroud)
什么是等价物for或while循环?
我想我需要用来GetEnumerator获得IEnumerator<Item>,但我不知道如何正确使用它.Items不是列表,否则我会使用索引.
Cod*_*aos 22
在最简单的情况下(没有处置等),您可以使用:
var enumerator = Items.GetEnumerator();// `var` to take advantage of more specific return type
while(enumerator.MoveNext())
{
Item item = enumerator.Current;
...
}
Run Code Online (Sandbox Code Playgroud)
对于确切的规则,请检查C#规范8.8.4 foreach语句.
表格的foreach声明
Run Code Online (Sandbox Code Playgroud)foreach (V v in x) embedded-statement然后扩展到:
Run Code Online (Sandbox Code Playgroud){ 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 typing.该规范还描述了许多极端情况以及如何推断这些类型,但这些细节可能与此无关.
在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.
//...
}
Run Code Online (Sandbox Code Playgroud)
如果您只是要访问迭代器,通常只需要使用foreach循环即可。但是,如果不能这样做,通常是有意义的模型:
using(IEnumerator<Item> iterator = Items.GetEnumerator())
while(iterator.MoveNext())
{
Item item = iterator.Current;
//do stuff
}
Run Code Online (Sandbox Code Playgroud)
从技术上讲,您可以for循环执行此操作,但是这样做会更困难,因为该构造与该格式不太吻合。如果您要讨论无法使用foreach循环的原因,无论是否涉及使用循环,我们都可以帮助您找到最佳的解决方案for。