2010-07-20 10 views
28

Poza ustawianiem zmiennej debugującej i zwiększaniem jej za każdym razem, gdy uruchamiasz foreach, po włamaniu do debugera Visual Studio jest jakiś sposób, aby powiedzieć, że jest to X czas w pętli?Debugowanie pętli foreach w języku C#: jaka jest to iteracja?

Domyślam się, że byłaby to funkcja Visual Studio, jeśli cokolwiek, a nie coś, co mogłoby zostać dodane do skompilowanego kodu.

+1

trwa dwie sekundy do konwersji 'foreach' Do' for' z indeksem. O co tyle szumu? –

+0

Czy nie byłoby dobrze, gdybyś napisał swoje powody, aby przegłosować? Nigdy nie miałem problemu z punktami granicznymi, o których pamiętam. Ma wiele funkcji, wystarczy kliknąć prawym przyciskiem myszy. –

+0

możliwy duplikat [(C#) Pobierz indeks aktualnej itachacji foreach] (http://stackoverflow.com/questions/43021/c-get-index-of-current-foreach-iteration) –

Odpowiedz

5

Herezje poprzedni Stos   przelewowy pytanie, które wydaje się być co swoje Szukam: get-index-of-current-foreach-iteration

Odbierz cytowany z tego linku:

Foreach jest dla iteracji po zbiorach, które wdrażają IEnumerable. Robi to, wywołując funkcję GetEnumerator w kolekcji, która spowoduje zwrócenie modułu wyliczającego przez .

Ten Enumerator ma metody i właściwości:

  • MoveNext()
  • Obecny

Aktualny zwraca obiekt, który Enumerator jest obecnie, MoveNext aktualizuje prąd do następnego obiektu .

Oczywiście pojęcie indeksu jest obce koncepcji wyliczenia i nie można tego zrobić.

Z tego powodu większość kolekcji można przechodzić za pomocą indeksera i konstrukcji pętli for.

Ja zdecydowanie wolę używać pętli for w tej sytuacji w porównaniu do śledzenia indeksu za pomocą zmiennej lokalnej.

5

Może być używana liczba trafień punktów przełomu. Nie dokładnie to, co chcesz, ale może być pomocne.

Czy jest jakiś poważny powód, dla którego nie chcesz używać pętli for w tym przypadku.

+0

1. Jaki jest sens posiadania foreach, jeśli nie można z niego korzystać? 2. Nie jest jasne, czy OP próbuje to zrobić z już uruchomionym programem, aby określić, ile razy pętla już została powtórzona. To jest problem, który próbowałem rozwiązać - trwa to wieczność, a ja chciałem sprawdzić, ile razy minął, aby oszacować, ile czasu zajmie. Zatrzymanie programu, zmiana kodu i rozpoczęcie wszystkiego od nowa jest ostatnią rzeczą, którą chcemy zrobić w tym scenariuszu! – Stewart

22

Ustaw punkt przerwania wewnątrz pętli, a następnie kliknij prawym przyciskiem myszy punkt przerwania, aby ustawić warunki. Możesz również kliknąć prawym przyciskiem myszy, aby zobaczyć liczbę trafień podczas debugowania i zresetować ją, jeśli chcesz. Można ustawić wyrażenie logiczne, które jest oceniane, gdy punkt przerwania trafi do warunkowego zerwania (lub po prostu przejścia).

+0

Właśnie wypróbowałem to (VS 2015 Pro) i nie, to nie działa. Jeśli warunek nie przejdzie, to tłumi przyrost liczby trafień, a nie tylko złamanie. – Stewart

2

Czy próbowałeś używać asercji w debugowaniu? Debugger zostanie uruchomiony w tym dokładnie miejscu w kodzie:
Na przykład: System.Diagnostics.Debug.Assert (myValue> = 0)

0

Jeśli cokolwiek jesteś iterowania obsługuje metodę IndexOf(), nie musisz ustawiać zmiennej debugowania.

Podobnie jak w poniższym przykładzie:

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

Może to prowadzić do zachowania n^2 (a tym samym katastrofalnego dla długich list). –

+0

A co, jeśli ten sam element pojawi się na liście więcej niż jeden raz? (Mam 'byte []' z ponad 3000 elementów ... stosuje się zasadę dziurkowania) –

4

Aktualizacja lut 2017, sześć lat później - rozszerzenie wymienione poniżej nazywa się teraz OzCode. Ta funkcja nazywa się teraz Foresee, ale jest obsługiwana tylko w VS2013.

Czułem również, że może to być bardzo przydatna funkcja, więc stworzyłem ją jako część komercyjnego rozszerzenia, które zrobiłem dla debugowania Visual Studio o nazwie BugAid.

Rozszerzenie pokazuje dokładnie, które iteracji jesteś, gdy jesteś wewnątrz pętli foreach: Foreach Buttons

Po kliknięciu „iteracji X z Y” przycisk, zobaczysz nowe okno, pokazując kompletny lista pozycji, z podświetloną bieżącą lokalizacją w pętli (ta lista jest wyświetlana tylko wtedy, gdy ocena kolekcji w debugerze nie powoduje żadnych skutków ubocznych).

Po otwarciu okna Wizualizacja foreach można nawet kliknąć prawym przyciskiem myszy dowolny z nadchodzących elementów i wybrać opcję "Przejdź do elementu", aby przejść do przodu, dopóki nie dotkniesz tego elementu (może to uchronić Cię przed ręcznym konfigurowaniem i odtwarzaniem z punktu przerwania hit-count):

Using Skip To Iteratioon

+0

Jak nigdy nie słyszałem o tym rozszerzeniu !!! ???? Jeśli działa tak dobrze, jak wygląda to absolutnie dzieje się na mojej liście "do zakupu"! – Vaccano

+0

Dziękuję :) Prawdopodobnie nie słyszałeś o tym, ponieważ właśnie wydaliśmy te funkcje wczoraj;). Wciąż jesteśmy w fazie beta, więc daj nam znać o każdym napotkanym problemie! –

+0

@OmerRaviv: Czy rozszerzenie, o którym teraz mowa, nazywa się teraz OzCode? Możesz zaktualizować swoje stare linki, a teraz dają sok Google do nikczemnej strony, która przejęła nazwę domeny. –

13

rozwijając na odpowiedź Garo Yeriazarian za ...

szybkie i brudne sposób bez rekompilacji. Przykładowy kod:

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

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

Dodaj jeden punkt przerwania przed pętlą i jeden w środku. Po pierwsze jest trafiony i chcesz rozpocząć liczenie, postawił warunek Odwiedzin:

two breakpoints

ustawić kilka dużych stan licznika trafień i wyzerować licznik i kontynuować. Następnie, gdy wyjątek lub cokolwiek się pojawi, możesz ponownie sprawdzić "Bieżące trafienie".

Hit count dialog

+0

Ta funkcja prawdopodobnie została usunięta w VS 2015 :( – Stewart