Pętla foreach C# pomija niektóre wyniki, a niektóre podaje podwójnie

0

Witam. Czy mógłby mi ktoś wytłumaczyć, jak dokładnie działa pętla foreach w języku C#? W programie stworzyłem tablicę jednowymiarową o pojemności 10 elementów i wczytałem je. następnie umieściłem w programie następujący kod:

 foreach (int b in tablica) 
            {
                Console.WriteLine("Element " + (b) + ". tablicy wynosi: ");
                Console.WriteLine(tablica[b]);
            }

I teraz problem... Co prawda, wyświetla mi 10 wyników, ale są dziwnie pomieszane. Przykładowy wynik działania programu (liczby wczytane przypadkowo):

Element 1. tablicy wynosi: 3
Element 3. tablicy wynosi: 5
Element 2. tablicy wynosi: 2
Element 5. tablicy wynosi: 7
Element 6. tablicy wynosi: 4
Element 7. tablicy wynosi: 8
Element 4. tablicy wynosi: 6
Element 8. tablicy wynosi: 9
Element 9. tablicy wynosi: 5
Element 5. tablicy wynosi: 7

Czyli, jak widać, w tym przypadku pominął zerowy element tablicy a powtórzył piąty. To nie reguła bo miesza to w różny sposób, potrafi zapomnieć na przykład o trzecim elemencie a powtórzyć siódmy, nie widzę żadnej reguły w tym mieszaniu wyników. O co z tym chodzi? Dlaczego tak się dzieje?

Pozdrawiam serdecznie

2

twoje b to nie indeks tylko wartość.
Czyli indeksujesz sobie kolejnymi wartościami, co jest kompletnie bez sensu.

1

Działa tak jak ma działać, czyli iteruje przypisując wartość, a nie indeks.

Jak masz tablicę

var ints = new int[] { 3,4,5,6 }; 

To twoje b przyjmie kolejno wartości 3, 4, 5 i 6. Czyli już w drugim obiegu dostaniesz wyjątek index out of range, bo spróbujesz odnieść się do ints[4], a takiego elementu nie ma.

0

Dzięki! Da się w ogóle wyświetlić po kolei wszystkie elementy tablicy używając tej pętli czy po prostu nie służy do tego celu?

0

Jak chcesz index to użyj zwykłego for.
Albo zrób tak:

int[] tablica = new int[] { 5, 3, 2, 7 };

foreach(var b in tablica.Select((value, i) => new { i, value }))
{
    Console.WriteLine("Element " + b.i + " tablicy wynosi: " + b.value);
}
Console.ReadLine();
0

Dziękować!

1
wojtek2s napisał(a):

Dzięki! Da się w ogóle wyświetlić po kolei wszystkie elementy tablicy używając tej pętli czy po prostu nie służy do tego celu?

Da się...

var ints = Enumerable.Range(0,10);
foreach(var x in ints)
{
   Console.WriteLine(x);
} 
0

a najlepiej użyj

string.Join()

1 użytkowników online, w tym zalogowanych: 0, gości: 1