对于VB.NET中2D阵列上的每个循环

时间:2011-10-14 15:32:47

标签: vb.net foreach iteration multidimensional-array

我正在编写一个循环来浏览2D循环的第一个数组,我现在有这样的:

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

但它给了我一个错误,说它希望在第一个字段中有一个表达式。但这就是我想要做的,循环通过第一个字段。我该如何解决?我会在那里放什么?

编辑:澄清一下,我特意在每个数组的子数组中寻找第0个元素,这就是为什么第二个字段始终为0。

3 个答案:

答案 0 :(得分:15)

您可以使用嵌套的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属性动态迭代每个维度

如果你想循环一个锯齿状的数组,就像Konrad Rudolph所建议的那样(这在功能上更接近地匹配其他更松散类型的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 :(得分:1)

你根本做不到。 .NET框架基础结构中并不真正支持多维数组。它们似乎被标记为事后的想法。最好的解决方案通常不是使用它们,而是使用锯齿状数组(数组数组 - Integer()()而不是Integer(,))。

答案 2 :(得分:0)

您可以递归使用Enumerable.Range来迭代数组的尺寸。

让我们说我们有一个Int的二维网格(行和列)。

我们可以如下迭代:

using System.Linq;

[TestMethod]
public void TestTwoDimensionalEnumeration()
{
    int rowcount = 9;
    int columncount = 9;
    int[,] grid = new int[rowcount, columncount];
    var enumerated =
        Enumerable.Range(0, rowcount - 1).
        SelectMany(ri => Enumerable.Range(0, columncount - 1).
        Select(ci => new {
                            RowIndex = ri,
                            ColumnIndex = ci,
                            Value = grid[ri,ci]
                         }));
    foreach (var item in enumerated)
    {
        System.Diagnostics.Trace.WriteLine("Row:" + item.RowIndex + 
                                          ",Column:" + item.ColumnIndex + 
                                          ",Value:" + item.Value);
    }
}

相同的逻辑可以应用于任意数量的尺寸。