Подтвердить что ты не робот

Отладка цикла foreach в С#: что это за итерация?

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

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

4b9b3361

Ответ 1

Вот предыдущий вопрос с вопросом о переполнении, который, похоже, выглядит следующим образом: get-index-of-current-foreach-iteration

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

Foreach предназначен для итерации над коллекциями, которые реализуют IEnumerable. Он делает это, вызывая GetEnumerator в коллекции, которая будет return Enumerator.

В этом перечислении есть метод и свойство:

  • MoveNext()
  • Current

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Добавьте одну точку останова перед циклом и внутри нее. Когда первый удар и вы хотите начать подсчет, установите условие "Хит-счет":

two breakpoints

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

Hit count dialog

Ответ 4

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

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

Ответ 5

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

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

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

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

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

Using Skip To Iteratioon

Ответ 6

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

Ответ 7

Скажем, ваш код

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

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

Ответ 8

Если все, что вы итерируете, поддерживает метод 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();
}

Ответ 9

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

querying the foreach iteration index in the Immediate Window