VisualBasic Array
tags: VB
Array
category: Programming
description: VisualBasic Array
created_at: 2021/08/02 06:00:00
事前準備
- 無
前言
今天整理雲端硬碟的時候發現在高三的時候整理過一份針對 VB Array
的文件,雖然 VB
這個東西應該沒什麼人用了,以前可能技藝競賽選手會使用(畢竟官方語言就是VB),但自從108課綱,已經不限制語言,未來應該會越來越少人用吧!
(雖然我覺得 VB
滿好用的,OOP該做得到的都做得到 這部分以後有時間在寫)
當以下說明函數使用到 變數.方法 時,將以Self.方法來代替,Self表示自身變數。
如下範例:
Array.Clone() 會表示為 Self.Clone()
如果函數的參數有預設值,將會以 Function(參數=值) 方式表示。
如下範例:
UBound(Self,維度 = 1),代表維度的預設值為1
Lambda => Function(variable) expression..
陣列(Array)
陣列的每一格都可以想像成一個變數,就是一連串使用連續記憶體位置的固定集合。
宣告陣列
Dim Array01(10) As Integer
Dim Array02() As Integer = {}
Dim Array03 As Integer() = {}
Dim Array04() As Integer = {1, 2, 3, 4}
Dim Array05 As Integer() = {1, 2, 3, 4}
Dim Array06() As Integer = New Integer(10) {}
Dim Array07 As Integer() = New Integer(10) {}
Dim Array08() As Integer = New Integer() {1, 2, 3, 4}
Dim Array09 As Integer() = New Integer() {1, 2, 3, 4}
以上這些宣告方式都是合法的,不會產生任何錯誤。
取值
陣列的索引從0開始編號,也就是如下表:
索引 | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
資料 | a | b | c | d | e |
Dim Array() As String = {"a", "b", "c", "d", "e"}
Dim Index As Integer = 1
Dim Data As String = Array(Index)
'Data => b
修改
與一般的變數一樣,只是需要加上索引。
Dim Array() As String = {"a", "b", "c", "d", "e"}
Dim Index As Integer = 1
Dim NewData As String = "A"
Array(Index) = NewData
Dim Data = Array(Index)
'Data => A
在這個範例中Index = 1,所以直接以Array(1) = NewData,結果也是一樣的。
變更後的陣列:
索引 | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
資料 | a | A | c | d | e |
改變大小
Dim Array() As String = {"a", "b", "c", "d", "e"}
ReDim Array(3)
ReDim可以重新定義陣列的大小,但是會把陣列中的元素全部清除,如上面的範例,執行後陣列的長相如下:
索引 | 0 | 1 | 2 | 3 |
---|---|---|---|---|
資料 | Nothing | Nothing | Nothing | Nothing |
如果希望改變大小後原來的元素還保留,則須加上 Preserve
關鍵字。
Dim Array() As String = {"a", "b", "c", "d", "e"}
ReDim Preserve Array(5)
執行後陣列如下:
索引 | 0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|
資料 | a | A | c | d | e | Nothing |
陣列函數
陣列拷貝(Clone)
深度拷貝 => 直接 = Self
淺層拷貝 => 使用 Self.Clone
深度拷貝
Dim Array() As String = {"a", "b", "c", "d", "e"}
Dim CloneArray() As String = Array
Array(1) = "A"
當做了這個操作後,Array與CloneArray的(1)都被修改成了A字串,因為他們用了相同的記憶體位置。
淺層拷貝
Dim Array() As String = {"a", "b", "c", "d", "e"}
Dim CloneArray() As String = Array.Clone
Array(1) = "A"
使用Clone函數後,再次修改(1)的值,只有Array的值被修改。
計算陣列某維度可存放幾個元素(GetLength)
語法 => Self.GetLength(維度 - 1)
如下範例:
計算一維 => Self.GetLength(0)
計算二維 => Self.GetLength(1)
依此類推...
Dim Array(2, 3) As String
Dim Length1 As Integer = Array.GetLength(0) ' 3
Dim Length2 As Integer = Array.GetLength(1) ' 4
Dim Length3 As Integer = Array.GetLength(2) ' Error
取得陣列最小索引 GetLowerBound
語法 => Self.GetLowerBound(維度 - 1)
如下範例
計算一維 => Self.GetLowerBound(0)
計算二維 => Self.GetLowerBound(1)
依此類推...
Dim Array(2, 3) As String
Dim Length1 As Integer = Array.GetLowerBound(0) ' 0
Dim Length2 As Integer = Array.GetLowerBound(1) ' 0
Dim Length3 As Integer = Array.GetLowerBound(2) ' Error
取得陣列最大索引 GetUpperBound
|| UBound
GetUpperBound
語法 => Self.GetUpperBound(維度 - 1)
如下範例
計算一維 => Self.GetUpperBound(0)
計算二維 => Self.GetUpperBound(1)
依此類推...
Dim Array(2, 3) As String
Dim Length1 As Integer = Array.GetUpperBound(0) ' 2
Dim Length2 As Integer = Array.GetUpperBound(1) ' 3
Dim Length3 As Integer = Array.GetUpperBound(2) ' Error
UBound
語法 => UBound(Self,維度 = 1)
如下範例
計算一維 => UBound(Self)
|| UBound(Self,1)
計算二維 => UBound(Self,2)
依此類推...
Dim Array(2, 3) As String
Dim MaxBound1 As Integer = UBound(Array, 1) '2
Dim MaxBound2 As Integer = UBound(Array, 2) '3
取得陣列可以存放多少項目(Length)
語法 => Self.Length
Dim Array1(3) As String
Dim Length1 As Integer = Array1.Length '4
Dim Array2(2, 3) As String
Dim Length2 As Integer = Array2.Length '12
取得陣列的維度(Rank)
語法 => Self.Rank
Dim Array1(3) As String
Dim Rank1 As Integer = Array1.Rank '1
Dim Array2(2, 3) As String
Dim Rank2 As Integer = Array2.Rank '2
進階函數(Array類別)
清除陣列元素(Array.Clear)
語法 => Array.Clear(Self,從哪個索引,刪除幾個)
Dim Data() As Integer = {1, 2, 3, 4, 5}
Array.Clear(Data, 1, 2)
'Data => {1,0,0,4,5}
轉換陣列的型態
語法 => Array.ConvertAll(Self,Lambda)
範例1:
Dim Data() As Integer = {1, 2, 3, 4, 5}
Dim newData() As String = Array.ConvertAll(Data, Function(x) x.ToString)
'newData => {"1","2","3","4","5"}
如上範例可以將Data陣列中的所有元素轉換為字串後傳回。
範例2:
Dim Data() As Integer = {1, 2, 3, 4, 5}
Dim newData() As String = Array.ConvertAll(Data, Function(x) Chr(64 + x).ToString)
'newData => {"A","B","C","D","E"}
如上範例可以將Data中所有的元素轉換為ASCII 64+n的值。
判斷陣列是否相等
語法 => Array.Equals(Self,Other)
|| Array.ReferenceEquals(Self,Other)
Dim Data() As Integer = {1, 2, 3, 4, 5}
Dim newData() As Integer = {1, 2, 3, 4, 5}
Dim ArrayEqual = Array.Equals(Data, newData)
'ArrayEqual => False
這個函數只有在使用一樣記憶體位置的情況下才會是True。
判斷陣列是否存在某元素
語法 => Array.Exists(Self,Lambda)
Dim Data() As Integer = {1, 2, 3, 4, 5}
Dim Data1 As Integer = 4
Dim Data2 As Integer = 7
Dim Data1Exists = Array.Exists(Data, Function(x) x = Data1) ' True
Dim Data2Exists = Array.Exists(Data, Function(x) x = Data2) ' False
尋找陣列中的資料(第一筆)
Array.FindLast 與 Array.Find 用法完全相同,差別在於Array.FindLast為回傳最後一個相符的結果。
語法 => Array.Find(Self,Lambda)
Dim Student1 As New Student
Student1.No = 1234
Student1.Name = "Admin"
Dim Student2 As New Student
Student2.No = 4444
Student2.Name = "Root"
Dim Students() As Student = {Student1, Student2}
Dim TargetNo1 As Integer = 1234
Dim TargetNo2 As Integer = 7777
Dim FindStudent1 As Student = Array.Find(Students, Function(stud) stud.No = TargetNo1) ' Equal Student1
Dim FindStudent2 As Student = Array.Find(Students, Function(stud) stud.No = TargetNo2) ' Nothing
尋找陣列中的資料(所有)
語法 => Array.FindAll(Self,Lambda)
Dim Number() As Integer = {1, 2, 3, 4, 5, 6, 7, 8, 9}
Dim Records() As Integer = Array.FindAll(Number, Function(x) x Mod 2 = 0)
如上範例將可以找出Number中所有的偶數。
尋找陣列中特定資料的索引 (多載=3)
Array.FindLastIndex 與 Array.FindIndex 用法完全相同,差別在於Array.FindLastIndex為回傳最後一個相符的結果。
語法1 => Array.FindIndex(Self,Lambda)
Dim Number() As Integer = {1, 2, 3, 4, 5, 6, 7, 8, 9}
Dim Index As Integer = Array.FindIndex(Number, Function(x) x Mod 2 = 0) '1
語法2 => Array.FindIndex(Self,從哪個索引開始尋找,Lambda)
Dim Number() As Integer = {1, 2, 3, 4, 5, 6, 7, 8, 9}
Dim Index As Integer = Array.FindIndex(Number, 2, Function(x) x Mod 2 = 0) '3
語法3 => Array.FindIndex(Self,從哪個索引開始尋找,比對幾個,Lambda)
Dim Number() As Integer = {1, 2, 3, 5, 5, 5, 5, 4, 1, 2}
Dim Index1 As Integer = Array.FindIndex(Number, 2, 5, Function(x) x Mod 2 = 0) '-1
Dim Index2 As Integer = Array.FindIndex(Number, 2, 6, Function(x) x Mod 2 = 0) '7
上面的範例如果沒有找到符合的元素將回傳-1。
尋找陣列簡單資料的索引(多載=6)
這邊簡單列出三種常用的
Array.LastIndexOf 與 Array.IndexOf 用法完全相同,差別在於Array.LastIndexOf為回傳最後一個相符的結果。
語法1 => Array.IndexOf(Self,資料)
語法2 => Array.IndexOf(Self,資料,從哪個索引開始尋找)
語法3 => Array.IndexOf(Self,資料,從哪個索引開始尋找,比對幾個)
Dim Number() As Integer = {1, 2, 3, 4, 5, 6, 7, 8, 9}
Dim Index1 = Array.IndexOf(Number, 5) '4
Dim Index2 = Array.IndexOf(Number, 5, 3) '4
Dim Index3 = Array.IndexOf(Number, 5, 7) '-1
Dim Index4 = Array.IndexOf(Number, 5, 3, 1) '-1
Dim Index5 = Array.IndexOf(Number, 5, 3, 2) '4
重新調整陣列大小
類似於 ReDim Preserve
語法 => Array.Resize(Self,大小)
Dim Data1() As Integer = {1, 2, 3, 4, 5}
Dim Data2() As Integer = {1, 2, 3, 4, 5}
Array.Resize(Data1, 3)
'Data1 => {1,2,3}
Array.Resize(Data2, 10)
'Data2 => {1,2,3,4,5,0,0,0,0,0}
將陣列反轉
語法 => Array.Reverse(Self)
Dim Data() As Integer = {1, 2, 3, 4, 5}
Array.Reverse(Data)
'Data => {5,4,3,2,1}
將陣列排序
語法 => Array.Sort(Self)
Dim Data1() As Integer = {4, 2, 3, 1, 5}
Array.Sort(Data1)
'Data1 => {1,2,3,4,5}
Dim Data2() As String = {"B", "D", "A"}
Array.Sort(Data2)
'Data2 => {"A","B","D"}
以ASCII排序
判斷陣列中的元素是否都符合某條件
語法 => Array.TrueForAll(Self,Lambda)
Dim Data() As Integer = {1, 2, 3, 4, 5}
Dim Test1 = Array.TrueForAll(Data, Function(x) x Mod 2 = 0) 'False
Dim Test2 = Array.TrueForAll(Data, Function(x) IsNumeric(x)) 'True
如上範例中,Test1測試陣列中的元素是否都為偶數,很顯然不成立,但Test2測試是否元素都為數字,是成立的。
迭代陣列中每一個元素
語法 => Array.ForEach(Self,Lambda)
Dim Data() As Integer = {1, 2, 3, 4, 5}
Dim NewData As New List(Of Integer)
Array.ForEach(Data, Sub(x As Integer)
NewData.Add(x * x)
End Sub)
上面的範例可以把Data中所有元素平方之後存入NewData中。