调试器可以告诉我foreach循环的计数/状态吗?

Vac*_*ano 8 c# debugging foreach

假设我有以下代码:

List<SomeObject> someObjects = ReturnListWithThousandsOfObjects();

foreach(SomeObject someobject in someObjects)
{
   DoSomething.With(someObject);
}
Run Code Online (Sandbox Code Playgroud)

并且还假设在运行一分钟之后我放了一个断点DoSomething.With(someObject);.

调试器对我来说很好.但是现在我想知道我在列表的迭代中的位置(假设列表是无序的/没有键).

有没有办法让调试器说" foreach已经运行了2321次迭代的532次"?

Mik*_*ler 9

作为一个调试一个没有索引方法?

quickwatch - someObjects.indexOf(someObject);

添加 - 对不起,如果有点简短.

正如Guffa所指出的,如果值是唯一的,或者默认的相等比较器EqualityComparer函数使用唯一值(例如自定义GetHashCode/Equals重载),这将最有效.

    public class ATest
    {
        public int number { get; set; }
        public int boo { get; set; }
        public ATest()
        {

        }
    }

    protected void Go()
    {
        List<ATest> list = new List<ATest>();

        foreach(var i in Enumerable.Range(0,30)) {
            foreach(var j in Enumerable.Range(0,100)) {
                list.Add(new ATest() { number = i, boo = j });                  
            }
        }

        var o =0; //only for proving concept.
        foreach (ATest aTest in list)
        {               
            DoSomthing(aTest);
            //proof that this does work in this example.
            o++;
            System.Diagnostics.Debug.Assert(o == list.IndexOf(aTest));
        }

    }
Run Code Online (Sandbox Code Playgroud)

  • @Mike Miller:我认为你应该加上它的局限性.它适用时仍然有用. (2认同)

And*_*rei 5

这适用于Visual Studio,但其他IDE应该有类似的东西:

设置断点时,可以右键单击它并转到"命中计数".你可以在那里设置一些参数("大于或等于"0将使它像常规断点一样工作 - 所以会"总是打破").有趣的部分是命中计数字段(可以重置).

这可以解决"迭代次数"部分.对于总数,我担心你将不得不自己找到它,假设你使用的系列有这样的数字随时可用.

您还可以将断点设置为在大量点击之后触发,比如几千/百万(我不知道它们的限制是多少).然后,当"真实"断点触发时,您想要知道原点断点被击中多少次,您可以检查它并在需要时重置它.