2011-10-14 12 views
7

Piszę pętlę, aby przejść przez pierwszą tablicę 2D pętli, a obecnie mam to tak:pętli For Each na tablicy 2D w VB.NET

For Each Dir_path In MasterIndex(, 0) 
    'do some stuff here 
Next 

Ale to daje mi błąd, mówiąc, że oczekuje wyrażenia w pierwszym polu. Ale to właśnie próbuję zrobić, przechodząc przez pierwsze pole. Jak to naprawić? Co by tam umieścić?

EDIT: wyjaśnienie, ja specjalnie szuka 0th elementu w subarray każdej tablicy, dlatego że drugie pole jest stale 0.

+0

I aktualizowany w celu uwzględnienia zarówno przykłady dla bardziej szczegółowego wniosku – JoshHetland

Odpowiedz

14

Można to osiągnąć z zagnieżdżonych pętli

Uwaga: W przypadku korzystania z pętli For Each iteracyjne nad elementów w tablicy, symbol zastępczy generowane na każdej iteracji jest kopią wartości w rzeczywistym układzie. Zmiany tej wartości nie zostaną odzwierciedlone w oryginalnej tablicy. Jeśli chcesz zrobić coś innego niż odczytać informacje, musisz użyć pętli For do bezpośredniego adresowania elementów tablicy.

Przyjmując tablicę dwuwymiarową poniższy przykład kodu przypisze wartość do każdego elementu w każdym wymiarze.

Dim MasterIndex(5, 2) As String 

For iOuter As Integer = MasterIndex.GetLowerBound(0) To MasterIndex.GetUpperBound(0) 
    'iOuter represents the first dimension 
    For iInner As Integer = MasterIndex.GetLowerBound(1) To MasterIndex.GetUpperBound(1) 
    'iInner represents the second dimension 
    MasterIndex(iOuter, iInner) = "This Isn't Nothing" 'Set the value 
    Next 'iInner 

    'If you are only interested in the first element you don't need the inner loop 
    MasterIndex(iOuter, 0) = "This is the first element in the second dimension" 
Next 'iOuter 
'MasterIndex is now filled completely 

Można ewentualnie użyć właściwości .Rank dynamicznie iteracyjne nad każdym wymiarze

Jeśli chcesz pętli nad postrzępionych tablicy jak Konrad Rudolph sugerował (Ten funkcjonalnie bardziej zbliżony do implementacji tablic w inny luźniej wpisywanych języki takie jak PHP) można przejść o nim tak:

'This is a jagged array (array of arrays) populated with three arrays each with three elements 
Dim JaggedIndex()() As String = { 
    New String() {"1", "2", "3"}, 
    New String() {"1", "2", "3"}, 
    New String() {"1", "2", "3"} 
} 

For Each aOuter As String() In JaggedIndex 
    'If you are only interested in the first element you don't need the inner for each loop 
    Dim sDesiredValue As String = aOuter(0) 'This is the first element in the inner array (second dimension) 

    For Each sElement As String In aOuter 
    Dim sCatch As String = sElement 'Assign the value of each element in the inner array to sCatch 
    sElement = "This Won't Stick" 'This will only hold value within the context of this loop iteration 
    Next 'sElement 
Next 'aOuter 
'JaggedIndex is still the same as when it was declared 
1

po prostu nie można. Wielowymiarowe tablice nie są tak naprawdę obsługiwane w infrastrukturze ramowej .NET. Wydaje się, że są one oznaczone jako refleksja. Najlepszym rozwiązaniem jest często ich nie używać i zamiast tego używać poszarpanych tablic (tablice tablic - Integer()() zamiast Integer(,)).

+0

więc zmieniłem go na 'MasterIndex()()', ale kiedy ponownie miejsce 'For Each Dir_path In MasterIndex (, 0)' with 'For Each Dir_path In MasterIndex() (0)' Otrzymuję 'Liczba indeksów jest mniejsza niż liczba wymiarów tablicy indeksowanej'? – jayjyli

+1

@Tim Ta składnia jest po prostu nieważna. Użyj 'For Each x In MasterIndex ... DirPath = x (0)' i rozpocznij pracę ... –