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