C#newbie:找出foreach块中的索引

Bab*_*goo 18 c# foreach

我有一个foreach块,我想为跟踪调试目的绘制foreach内部步骤的索引.作为一个C#新手我做如下:

int i = 1;

foreach (x in y)
{
    ... do something ...
    WriteDebug("Step: "+i.ToString());
    i++;
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有任何方法可以获得当前步骤索引的值而无需为此目的明确创建变量.

编辑:为了澄清,我显然熟悉for循环的选项,但它不是我正在经历的数组,而是一个无序的集合.编号的原因仅仅是为了显示调试级别的进度,而不是其他任何内容.

Mar*_*ell 24

与其他一些答案相反,我非常乐意foreach与计数器混合(根据问题中的代码).这保留了您使用IEnumerable[<T>]而不需要索引器的能力.

但如果你想,在LINQ中:

    foreach (var pair in y.Select((x,i) => new {Index = i,Value=x})) {
        Console.WriteLine(pair.Index + ": " + pair.Value);
    }
Run Code Online (Sandbox Code Playgroud)

(问题中的反制方法更简单,更有效,但上面应该更好地映射到一些场景,如Parallel.ForEach).

  • Inside Select ;-p基本上,你需要给这个重载选择一个`Func <TInput,int,TOutput>` - 即给定值和索引,做一些事情......参见MSDN:http://msdn.microsoft .COM/EN-US /库/ bb534869.aspx (3认同)
  • Marc,你上面的选择声明破坏了我的头:)(我不是linq专家).增加我的魔力在哪里? (2认同)

Bin*_*ier 22

不,那里没有.

这是一个你最好使用基本for循环的例子

for(int i = 0; i < y.Count; i++)
{
}
Run Code Online (Sandbox Code Playgroud)

而不是每个循环

编辑:回应askers的澄清.

如果您正在迭代没有大小属性​​(例如长度或计数)的枚举器,那么您的方法就像您可以获得的那样清晰.

第二次编辑
鉴于我是笨蛋,这些天我会用select来做Marc的答案.


mar*_*c_s 5

不,真的,在foreach循环中没有隐含的"计数器".

foreach循环在封面后面做的是创建一个IEnumerator,然后逐个循环遍历项目,在IEnumerator接口上调用.MoveNext()方法.

(不幸的是?)IEnumerator接口上没有暴露的计数器变量 - 只有.Reset()和.MoveNext()方法和一个Current属性(返回当前项)

  • 如果他需要并希望保留foreach,那么是的,有一个单独的`int`变量作为索引是唯一的,正确的,要做的事,不是吗? (2认同)