跳至內容

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
[編輯 | 編輯原始碼]
華夏公益教科書