我有一个foreach块,为了进行跟踪调试,我想在其中绘制foreach内部步骤的索引。作为一名C#新手,我这样做:
int i = 1;
foreach (x in y)
{
... do something ...
WriteDebug("Step: "+i.ToString());
i++;
}
我想知道是否有任何方法可以获得当前步骤的索引值,而无需为此目的显式创建一个变量。
编辑:为了澄清,我显然熟悉for循环的选项,但是我正在处理的不是一个数组,而是一个无序集合。编号的目的只是为了显示调试级别的进度,而不是其他。
发布于 2009-07-28 07:53:12
与其他一些答案相反,我非常乐意将foreach
与计数器混合(根据问题中的代码)。这保留了您使用IEnumerable[<T>]
的能力,而不需要索引器。
但如果你愿意,在LINQ中:
foreach (var pair in y.Select((x,i) => new {Index = i,Value=x})) {
Console.WriteLine(pair.Index + ": " + pair.Value);
}
(问题中的反方法要简单得多,也更有效,但上面的方法应该更好地映射到像Parallel.ForEach这样的几个场景)。
发布于 2009-07-28 07:42:17
不,在foreach循环中没有隐式的“计数器”,真的。
foreach循环在幕后执行的操作是创建一个IEnumerator,然后调用IEnumerator接口上的.MoveNext()方法,逐个循环遍历这些项。
(不幸的是?)没有在IEnumerator接口上公开计数器变量-只有.Reset()和.MoveNext()方法和Current
属性(返回当前项)
Marc
发布于 2009-07-28 07:42:08
不,没有办法在foreach循环中得到它。对于这种情况,您应该使用For循环,或者,正如您所提到的,显式地创建一个用于计数的变量。
https://stackoverflow.com/questions/1192447
复制相似问题