Отладка цикла foreach в C#: какое повторение - это?

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

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

34
задан Peter Mortensen 28 July 2015 в 12:11
поделиться

5 ответов

Вот предыдущий вопрос Stack Overflow, который, похоже, соответствует тому, что вы ищете: get-index-of-current-foreach-iteration

Ответ, процитированный по этой ссылке:

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

У этого перечислителя есть метод и свойство:

  • MoveNext()
  • Current

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

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

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

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

7
ответ дан 27 November 2019 в 16:40
поделиться

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

23
ответ дан 27 November 2019 в 16:40
поделиться

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

2
ответ дан 27 November 2019 в 16:40
поделиться

Если все, что вы повторяете, поддерживает метод 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();
}
0
ответ дан 27 November 2019 в 16:40
поделиться

Возможно, вы можете использовать счетчик попаданий в точку останова. Это не совсем то, что вам нужно, но может быть полезно.

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

5
ответ дан 27 November 2019 в 16:40
поделиться