Для каждого цикла в двумерном массиве в VB.NET - PullRequest
8 голосов
/ 14 октября 2011

Я пишу цикл для прохождения первого массива 2D цикла, и в настоящее время у меня это выглядит так:

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

Но он дает мне ошибку, говоря, что ожидает выражение в первом поле. Но это то, что я пытаюсь сделать, пройтись по первому полю. Как это исправить? Что бы я там положил?

РЕДАКТИРОВАТЬ: чтобы уточнить, я специально ищу 0-й элемент в подмассиве каждого массива, поэтому это второе поле постоянно 0.

Ответы [ 2 ]

15 голосов
/ 14 октября 2011

Это можно сделать с помощью вложенных циклов For

Примечание. При использовании цикла For Each для итерации по элементам в массиве заполнитель, сгенерированный на каждой итерации, является копией значения в реальном массиве.Изменения этого значения не будут отражены в исходном массиве.Если вы хотите сделать что-то кроме чтения информации, вам нужно использовать цикл For для непосредственного обращения к элементам массива.

Предполагая двумерный массив, следующий пример кода назначит значение каждому элементу в каждомизмерение.

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

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

Если вы хотите перебрать неровный массив, как предлагал Конрад Рудольф (Это функционально болееблизко соответствует реализации массива в других более свободно типизированных языках, таких как PHP), вы можете сделать это примерно так:

'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 голос
/ 14 октября 2011

Вы просто не можете.Многомерные массивы на самом деле не поддерживаются в инфраструктуре .NET Framework.Кажется, они помечены как запоздалая мысль.Лучшее решение часто состоит в том, чтобы не использовать их, а вместо этого использовать зубчатые массивы (массивы массивов - Integer()() вместо Integer(,)).

...