在C#中调试foreach循环:这是什么迭代?

Mat*_*att 34 .net c# debugging foreach visual-studio

除了设置调试变量并在每次启动foreach时递增它,当你连接Visual Studio调试器时,有没有办法告诉这是循环中的第X个时间?

我想这将是Visual Studio的一个功能,如果有的话,不会添加到已编译的代码中.

Gar*_*ian 23

在循环内设置断点,然后右键单击断点以设置条件.您也可以在调试时右键单击以查看命中计数,并根据需要重置它.您可以设置一个布尔表达式,当断点点击有条件地中断(或者只是传递)时会对其进行求值.


joh*_*ohv 13

扩展Garo Yeriazarian的答案......

一种快速而肮脏的方式,无需重新编译.示例代码:

    var ints = new[] {5, 6, 0, 1};

    foreach (var i in ints)
    {
        Debug.WriteLine(100 / i);
    }
Run Code Online (Sandbox Code Playgroud)

在循环之前添加一个断点,在其中添加一个断点.当第一个被击中并且您想要开始计数时,设置命中计数条件:

两个断点

设置一些大的命中计数条件并重置计数器并继续.然后当异常或任何火灾时,您可以再次检查"当前命中数".

命中计数对话框


jum*_*art 7

以下是一个以前的Stack Overflow问题,它似乎是您正在寻找的: get-index-of-current-foreach-iteration

从该链接引用的答案:

Foreach用于迭代实现IEnumerable的集合.它通过在集合上调用GetEnumerator来执行此操作,该集合将返回Enumerator.

此枚举器有一个方法和属性:

  • 的MoveNext()
  • 当前

Current返回Enumerator当前所在的对象,MoveNext将Current更新为下一个对象.

显然,索引的概念对于枚举的概念是陌生的,并且不能完成.

因此,大多数集合都可以使用索引器和for循环结构遍历.

与使用局部变量跟踪索引相比,我更倾向于在这种情况下使用for循环.


小智 6

您还可以使用Visual Studio的即时窗口,它允许您在调试时针对作用域中的任何变量编写C#表达式。使用List.IndexOf()方法,如下所示:

在立即窗口中查询foreach迭代索引

  • 有用!当所有对象都是唯一的并且在列表/数组中时...不过要小心,可能会有重复项,并且 foreach 可能超出了 `list.Where(x => x != null)`。它实际上是“当前对象的第一个索引是什么”的答案,而不是“当前迭代的索引是什么”。 (3认同)
  • 简单又容易! (2认同)

Inc*_*ito 5

可能是你可以使用断点命中计数.不完全是你想要的,但可能会有所帮助.

还有任何严重的原因,你不想for在这种情况下使用循环.


Kim*_*ann 5

Visual Studio 2017 中的点击次数:

  1. 在循环内的任意位置设置断点foreach
  2. 右键单击断点,然后单击“条件...”。

状况

  1. 选中“条件”框,将下拉菜单切换到“点击数”并编辑您的点击数设置。

命中数

  1. 停止时,将鼠标悬停在断点上以查看您的设置以及迄今为止达到的命中计数。

徘徊

  1. 不要忘记,当您在同一会话中第二次进入循环时,您的点击计数不会自动重置为零。;-) 但您可以手动重置它:

重置