你如何获得foreach循环的当前迭代的索引?
是否有一些罕见的语言构造我没有遇到(像我最近学到的一些,在堆栈溢出一些)在C#中获得一个值代表当前迭代的foreach循环?
例如,我现在根据具体情况做这样的事情:
int i=0;
foreach (Object o in collection)
{
// ...
i++;
}
foreach
用于迭代实现IEnumerable
集合。 它通过调用集合上的GetEnumerator
来完成此操作,该集合将返回一个Enumerator
。
这个枚举器有一个方法和一个属性:
Current
返回Enumerator Current
的对象, MoveNext
Current
更新为下一个对象。
显然,一个索引的概念对于枚举的概念来说是陌生的,不可能完成。
因此,大多数集合都可以使用索引器和for循环结构来遍历。
与使用局部变量跟踪索引相比,我更喜欢在这种情况下使用for循环。
Ian Mercer在Phil Haack的博客上发布了类似的解决方案:
foreach (var item in Model.Select((value, i) => new { i, value }))
{
var value = item.value;
var index = item.i;
}
这通过使用Linq的Select
重载获取item( item.value
)及其索引( item.i
):
函数[在Select中]的第二个参数表示源元素的索引。
new { i, value }
正在创建一个新的匿名对象。
可以做这样的事情:
public static class ForEachExtensions
{
public static void ForEachWithIndex<T>(this IEnumerable<T> enumerable, Action<T, int> handler)
{
int idx = 0;
foreach (T item in enumerable)
handler(item, idx++);
}
}
public class Example
{
public static void Main()
{
string[] values = new[] { "foo", "bar", "baz" };
values.ForEachWithIndex((item, idx) => Console.WriteLine("{0}: {1}", idx, item));
}
}
链接地址: http://www.djcxy.com/p/1521.html
上一篇: How do you get the index of the current iteration of a foreach loop?