Отладка цикла foreach в C #: что это за итерация? - PullRequest
33 голосов
/ 20 июля 2010

Кроме установки переменной отладки и ее приращения при каждом запуске foreach, когда вы обрываетесь с подключенным отладчиком Visual Studio, есть ли способ сказать, что это X-й раз в цикле?

Полагаю, это будет особенность Visual Studio, а не то, что будет добавлено в скомпилированный код.

Ответы [ 10 ]

23 голосов
/ 20 июля 2010

Установите точку останова внутри цикла, затем щелкните правой кнопкой мыши на точке останова, чтобы установить условия. Вы также можете щелкнуть правой кнопкой мыши, чтобы увидеть количество совпадений при отладке и сбросить его, если хотите. Вы можете установить логическое выражение, которое оценивается, когда точка останова достигает условного прерывания (или просто передать).

13 голосов
/ 03 мая 2013

Расширяя ответ Гаро Йериазаряна ...

Быстрый и грязный способ без перекомпиляции.Пример кода:

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

    foreach (var i in ints)
    {
        Debug.WriteLine(100 / i);
    }

Добавьте одну точку останова перед циклом и одну внутри него.Когда первое нажато, и вы хотите начать подсчет, установите условие «Счетчик обращений»:

two breakpoints

Установите несколько условий большого количества обращений, сбросьте счетчик и продолжайте.Затем, когда сработает исключение или что-то еще, вы можете снова проверить «Счетчик текущих ударов».

Hit count dialog

7 голосов
/ 20 июля 2010

Вот предыдущий вопрос переполнения стека, который, кажется, вам нужен: получить индекс-в-ток-Еогеасп-итерации

Ответ цитируется по этой ссылке:

Foreach для перебора коллекций, которые реализуют IEnumerable. Это делается путем вызова GetEnumerator для коллекции, которая вернуть перечислитель.

Этот перечислитель имеет метод и свойство:

  • MoveNext ()
  • Текущее

Current возвращает объект, на котором в данный момент находится Enumerator, MoveNext обновляет Current до следующего объекта.

Очевидно, что понятие индекса чуждо понятию перечисление, и не может быть сделано.

Из-за этого большинство коллекций можно просматривать с помощью индексатор и конструкция цикла for.

Я очень предпочитаю использовать цикл for в этой ситуации по сравнению с отслеживание индекса с помощью локальной переменной.

5 голосов
/ 20 июля 2010

Может быть, вы можете использовать количество посещений точки останова. Не совсем то, что вы хотите, но может быть полезным.

Также есть какая-то серьезная причина, по которой вы не хотите использовать цикл for в этом случае.

4 голосов
/ 18 ноября 2011

Обновление февраль 2017 г., шесть лет спустя - упомянутое ниже расширение теперь называется OzCode . Функция теперь называется Foresee , но поддерживается только в VS2013.

Я также чувствовал, что это может быть очень полезной функцией, поэтому я создал ее как часть коммерческого расширения, которое я сделал для отладки в Visual Studio под названием BugAid.

Расширение точно показывает, какой итерацией вы являетесь, когда находитесь внутри цикла foreach: Foreach Buttons

Когда вы нажмете кнопку «Итерация x of y», вы увидите новое окно с полным списком элементов, в котором выделено ваше текущее местоположение в цикле (этот список отображается только при оценке коллекции в отладчик не вызывает никаких побочных эффектов).

Как только вы откроете окно визуализации Foreach, вы можете даже щелкнуть правой кнопкой мыши по любому из предстоящих элементов и выбрать «Перейти к элементу», чтобы двигаться вперед до тех пор, пока вы не нажмете этот элемент (это может спасти вас от ручной настройки и работы контрольная точка подсчета хитов):

Using Skip To Iteratioon

3 голосов
/ 06 апреля 2018

Допустим, ваш код

foreach (String line in lines){
    Console.WriteLine(line);//breakpoint here
}

Поместите точку останова внутри цикла foreach, запустите «Немедленное окно» и выполните следующий код Array.IndexOf(lines, line);

2 голосов
/ 07 декабря 2018

Вы также можете использовать Visual Studio Immediate Window , которое позволяет записывать выражения C # для любых переменных в области видимости при отладке.Используйте метод List.IndexOf (), например, так:

querying the foreach iteration index in the Immediate Window

2 голосов
/ 20 июля 2010

Вы пытались использовать утверждение при отладке? Отладчик будет запущен именно в той точке вашего кода:
Например: System.Diagnostics.Debug.Assert (myValue> = 0)

1 голос
/ 06 февраля 2019

Вот как я это делаю [в VS 2017]:

  1. Установите точку останова внутри цикла foreach
  2. Щелкните правой кнопкой мыши точку останова и выберите «Действия»
  3. В текстовом поле введите следующее: $FUNCTION {list.Items.IndexOf(item)}, где 'list' - это имя вашего списка, а 'item' - текущий элемент
  4. Продолжите выполнение кода и посмотрите окно вывода
0 голосов
/ 20 июля 2010

Если все, что вы делаете, поддерживает метод IndexOf (), вам не нужно устанавливать переменную отладки.

Как в этом примере:

foreach (var i in myList)
{
    reportprogress(myList, i);

    //Do stuff
}

private void reportprogress<T>(List<T> l, T i)
{
    progressBar1.Value = ((l.IndexOf(i)) * 100) / l.Count;
    Application.DoEvents();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...