跳至内容

Visual Basic .NET/数组

来自维基教科书,开放的书籍,为了一个开放的世界

简单数组

[编辑 | 编辑源代码]

数组只是一个可以存储多个数据的变量。数据被存储在一个列表中。如果你声明一个整数,那么该变量只能存储一个整数。一个整数数组可以存储多个整数。每一个都有它自己的编号。
例如,这行代码

 Dim MyArray(5) As Integer

将得到一个像这样的数组

索引 数据
00
01
02
03
04
05
 Dim arrayName(upperBound) As arrayType

这类似于声明一个普通变量,但有一点区别,就是upperBound参数。与之前的Visual Basic版本不同,Visual Basic .NET中的所有数组都从0开始,到upperBound结束,例如

 Dim MyArray(10) As Integer

将声明一个名为MyArray的变量,它有11个整数的空间。这些整数存储在MyArray(0)、MyArray(1)、...、MyArray(10)中。

要声明一个数组并在同一行中赋值,请使用以下代码

 Dim MyArray() As Integer = New Integer(4) { 1, 2, 3, 4, 5 }

另一种创建数组的方法如下

 Module Module1
   Sub Main()

       Dim MyArray As System.Array
       MyArray = System.Array.CreateInstance(GetType(String), 4)
       MyArray(0) = "a"
       MyArray(1) = "b"
       MyArray(2) = "c"
       MyArray(3) = "d"
       Console.WriteLine("Press enter to continue")
       Console.ReadLine()

   End Sub
 End Module

注意,无论何时使用以下这些代码

 Dim MyArray As System.Array
 MyArray = System.Array.CreateInstance(GetType(String), 4)

这表示相同的意思,而且更容易使用

 MyArray = System.Array.CreateInstance(GetType(String), 4)

变量名称后的(number)声明它是一个字符串。

要访问数组中的一个元素

 Module Module1
   Sub Main()

       Dim MyArray As System.Array
       MyArray = System.Array.CreateInstance(GetType(String), 4)
       MyArray(0) = "a"
       MyArray(1) = "b"
       MyArray(2) = "c"
       MyArray(3) = "d"
       Console.WriteLine(MyArray.GetValue(2)) 'returns c
       Console.WriteLine("Press enter to continue")
       Console.ReadLine()

   End Sub
 End Module

我们数组中有多少个元素?

 Module Module1
   Sub Main()
       '
       Dim MyArray As System.Array
       MyArray = System.Array.CreateInstance(GetType(String), 4)
       MyArray(0) = "a"
       MyArray(1) = "b"
       MyArray(2) = "c"
       MyArray(3) = "d"
       Console.WriteLine(MyArray.Length)
       'displays 4
       Console.WriteLine("Press enter to continue")
       Console.ReadLine()
       '    
   End Sub
 End Module

显示数组中的所有元素。

 Module Module1
   Sub Main()
       '
       Dim MyArray As System.Array
       Dim En As System.Collections.IEnumerator
       MyArray = System.Array.CreateInstance(GetType(String), 4)
       '
       MyArray(0) = "a"
       MyArray(1) = "d"
       MyArray(2) = "b"
       MyArray(3) = "c"
       En = MyArray.GetEnumerator
       '
       Do While En.MoveNext
           Console.WriteLine(En.Current())
       Loop
       '
       Console.WriteLine("Press enter to continue")
       Console.ReadLine()
   End Sub
 End Module

对数组进行排序。

 Module Module1
   Sub Main()
       '
       Dim MyArray As System.Array
       Dim En As System.Collections.IEnumerator
       MyArray = System.Array.CreateInstance(GetType(String), 4)
       '
       MyArray(0) = "a"
       MyArray(1) = "d"
       MyArray(2) = "b"
       MyArray(3) = "c"
       En = MyArray.GetEnumerator
       Console.WriteLine("Before sorting")
       Do While En.MoveNext
           Console.WriteLine(En.Current())
       Loop
       Array.Sort(MyArray)
       En = MyArray.GetEnumerator
       Console.WriteLine("After sorting")
       Do While En.MoveNext
           Console.WriteLine(En.Current())
       Loop
       '
       Console.WriteLine("Press enter to continue")
       Console.ReadLine()
   End Sub
 End Module

按降序排序。

 Module Module1
   Sub Main()
       '
       Dim MyArray As System.Array
       Dim En As System.Collections.IEnumerator
       Dim DescSortCompare = New DescSortCompareClass
       MyArray = System.Array.CreateInstance(GetType(String), 4)
       '
       MyArray(0) = "a"
       MyArray(1) = "d"
       MyArray(2) = "b"
       MyArray(3) = "c"
       En = MyArray.GetEnumerator
       Console.WriteLine("Before descending sort")
       Do While En.MoveNext
           Console.WriteLine(En.Current())
       Loop
       Array.Sort(MyArray, DescSortCompare)
       En = MyArray.GetEnumerator
       Console.WriteLine("After descending sort")
       Do While En.MoveNext
           Console.WriteLine(En.Current())
       Loop
       '
       Console.WriteLine("Press enter to continue")
       Console.ReadLine()
   End Sub
   '
   Public Class DescSortCompareClass
       Implements IComparer
       '
       Function Compare(ByVal x As Object, ByVal y As Object) As Integer _
          Implements IComparer.Compare
           Return x > y
       End Function
       '
   End Class
 End Module

反转数组。

 Module Module1
   Sub Main()
       '
       Dim MyArray As System.Array
       Dim En As System.Collections.IEnumerator
       MyArray = System.Array.CreateInstance(GetType(String), 4)
       '
       MyArray(0) = "a"
       MyArray(1) = "d"
       MyArray(2) = "b"
       MyArray(3) = "c"
       En = MyArray.GetEnumerator
       Console.WriteLine("Before reversing the array")
       Do While En.MoveNext
           Console.WriteLine(En.Current())
       Loop
       Array.Reverse(MyArray)
       En = MyArray.GetEnumerator
       Console.WriteLine("After reversing the array")
       Do While En.MoveNext
           Console.WriteLine(En.Current())
       Loop
       '
       Console.WriteLine("Press enter to continue")
       Console.ReadLine()
   End Sub
   '
 End Module

现在我们有了Reverse,这里有另一种在不使用IComparer的情况下进行降序排序的方法。

 Module Module1
   Sub Main()
       '
       Dim MyArray As System.Array
       Dim En As System.Collections.IEnumerator
       MyArray = System.Array.CreateInstance(GetType(String), 4)
       '
       MyArray(0) = "a"
       MyArray(1) = "d"
       MyArray(2) = "b"
       MyArray(3) = "c"
       '
       En = MyArray.GetEnumerator
       Console.WriteLine("Before descending sort")
       Do While En.MoveNext
           Console.WriteLine(En.Current())
       Loop
       Array.Sort(MyArray)
       Array.Reverse(MyArray)
       En = MyArray.GetEnumerator
       Console.WriteLine("After descending sort")
       Do While En.MoveNext
           Console.WriteLine(En.Current())
       Loop
       '
       Console.WriteLine("Press enter to continue")
       Console.ReadLine()
   End Sub
 End Module

在使用 Option Strict On 的情况下,我们需要使用 SetValue 来赋值数组元素。

 Option Strict On
 Module Module1
   Sub Main()
       '
       Dim MyArray As System.Array
       Dim En As System.Collections.IEnumerator
       MyArray = System.Array.CreateInstance(GetType(String), 4)
       '
       MyArray.SetValue("a", 0)
       MyArray.SetValue("d", 1)
       MyArray.SetValue("b", 2)
       MyArray.SetValue("c", 3)
       '
       En = MyArray.GetEnumerator
       Console.WriteLine("Before descending sort")
       Do While En.MoveNext
           Console.WriteLine(En.Current())
       Loop
       Array.Sort(MyArray)
       Array.Reverse(MyArray)
       En = MyArray.GetEnumerator
       Console.WriteLine("After descending sort")
       Do While En.MoveNext
           Console.WriteLine(En.Current())
       Loop
       '
       Console.WriteLine("Press enter to continue")
       Console.ReadLine()
   End Sub
 End Module

多维数组

[编辑 | 编辑源代码]

数组也可以是多维的 - 2D、3D、4D 等。例如,这行代码

 'Declare an 2D Array with integers(X, Y)
 Dim My2DArray(2, 2) As Integer

将得到一个像这样的数组

索引 数据
0, 0
0, 1
0, 2
1, 0
1, 1
1, 2
2, 0
2, 1
2, 2

2D 数组可以用于像井字游戏这样的游戏中。

3D 数组可以被认为是 2D 数组的数组。2D 数组有行和列,就像井字游戏中一样,3D 数组存储多个井字游戏的网格。

要声明一个 3D 数组

 'Declare an 3D Array of integers(X, Y)
 Dim My3DArray(1, 2, 2) As Integer

在这个例子中,第一维通常是这个 3D 数组中的数组数量。我们知道这些是 2D 数组,因为第二维指定了这些数组中的行数,第三维指定了列数。

数组操作方法

[编辑 | 编辑源代码]
  • Split() : 将字符串转换为数组,根据参数中指定的分割符。
  • Join() : 将数组转换为字符串。
  • Filter() : 筛选一些数组条目。

示例

 Module Module1
   Sub Main()
     Dim ArrayName() As String = Split("lorem ipsum dolor sit", " ")
     Console.WriteLine(ArrayName(1))  ' displays "ipsum"

     ArrayName(4) = "amet"
     Dim ArrayContent As String = String.Join(" ", ArrayName)
     Console.WriteLine(ArrayContent)

     Dim SubArray = Filter(ArrayName, "o", True, CompareMethod.Text)
     Console.WriteLine(String.Join(" ", SubArray))  ' displays the words including "o"

     Console.ReadLine()
   End Sub
 End Module
[编辑 | 编辑源代码]
华夏公益教科书