Déboguer une boucle foreach en C#: quelle itération est-ce?

mis à part le fait de définir une variable de débogage et de l'incrémenter à chaque fois que vous démarrez l'foreach, lorsque vous entrez par effraction avec le débogueur Visual Studio connecté, y a-t-il un moyen de dire que c'est la Xème fois à travers la boucle?

je suppose que ce serait une fonctionnalité de Visual Studio s'il y avait quelque chose, pas quelque chose qui serait ajouté au code compilé.

30
demandé sur Peter Mortensen 2010-07-20 22:21:17

8 réponses

Voici une question précédente de débordement de pile qui semble être ce que vous cherchez: get-indice-de-courant-foreach-itération

réponse tirée de ce lien:

Foreach est pour itérer sur les collections de mettre en œuvre IEnumerable. Il le fait en appelant GetEnumerator sur la collection, qui sera retournez un recenseur.

ce recenseur a une méthode et un propriété:

  • MoveNext ()
  • courant

retourne L'objet sur lequel Enumerator est actuellement, MoveNext les mises à jour Actuelles à l'objet suivant.

de toute évidence, la notion d'indice est étrangère à celle de l'énumération, et ne peut pas être fait.

pour cette raison, la plupart des collections peuvent être parcourues en utilisant un l'indexeur et la construction pour boucle.

je préfère grandement utiliser une boucle for dans cette situation par rapport à suivi de l'indice avec une variable locale.

6
répondu jumpdart 2017-05-23 11:55:03

définit un point de rupture à l'intérieur de la boucle, puis clic droit sur le point de rupture pour définir les conditions. Vous pouvez également faire un clic droit pour voir le nombre de hits lors du débogage et le réinitialiser si vous le souhaitez. Vous pouvez définir une expression booléenne qui est évaluée lorsque le point de rupture atteint à rupture conditionnelle (ou tout simplement passer).

22
répondu Garo Yeriazarian 2010-07-20 18:26:50

développant la réponse de Garo Yeriazarian...

une voie rapide et sale sans recompiler. Exemple de code:

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

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

ajoute un point de rupture avant la boucle et un à l'intérieur. Lorsque la première est touchée et que vous voulez commencer à compter, définissez une condition de nombre de coups:

two breakpoints

réglez un grand nombre de coups et réinitialisez le compteur et continuez. Puis quand l'exception ou peu importe ce qui se déclenche, vous pouvez à nouveau Vérifier le "nombre de frappes en cours".

Hit count dialog

13
répondu johv 2013-05-03 09:08:05

peut être que vous pouvez utiliser Break Point hit count. Pas exactement ce que vous voulez, mais peut être utile.

il y a aussi une raison sérieuse pour laquelle vous ne voulez pas utiliser la boucle for dans ce cas.

5
répondu Incognito 2010-07-20 18:26:06

mise à jour fév 2017, six ans plus tard - l'extension mentionnée ci-dessous est maintenant appelé OzCode . Cette fonctionnalité est maintenant appelée foreseen , mais n'est prise en charge que dans VS2013.

j'ai également pensé que cela pourrait être une fonctionnalité très utile, donc je l'ai créé dans le cadre d'une extension commerciale que j'ai faite pour L'expérience de débogage Visual Studio appelée BugAid.

l'extension vous montre exactement quelle itération vous êtes chaque fois que vous êtes à l'intérieur d'une boucle foreach: Foreach Buttons

lorsque vous cliquez sur le bouton" itération x de y", vous verrez une nouvelle fenêtre, montrant la liste complète des éléments, avec votre emplacement actuel dans la boucle en surbrillance (cette liste n'est affichée que si l'évaluation de la collection dans le débogueur ne provoque pas d'effets secondaires).

une fois que vous ouvrez cette fenêtre de visualisation, vous pouvez même faire un clic droit sur des éléments à venir et choisissez "Skip to Item", pour aller de l'avant jusqu'à ce que vous appuyez sur cet élément (cela peut vous éviter de configurer et de jouer manuellement avec le point de rupture de hit-count):

Using Skip To Iteratioon

4
répondu Omer Raviv 2017-02-24 22:01:09

avez-vous essayé d'utiliser assertion dans le débogage? Le débogueur sera lancé à ce point précis de votre code:

par exemple: Système .Diagnostic.Débogage.Assert (mavaleur >=0)

2
répondu 2010-07-20 18:27:59

si ce que vous itérez supporte la méthode IndexOf (), vous n'avez pas à définir une variable de débogage.

comme dans cet exemple:

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
répondu Luiscencio 2015-07-28 12:38:48

disons que votre code est

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

mettre un point de rupture à l'intérieur foreach boucle, lancer "fenêtre immédiate" et exécuter le code suivant Array.IndexOf(lines, line);

0
répondu user961954 2018-04-06 00:31:22