VisualBasic Array

tags: VB Array
category: Programming
description: VisualBasic Array
created_at: 2021/08/02 06:00:00

cover image

事前準備


前言

今天整理雲端硬碟的時候發現在高三的時候整理過一份針對 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中。




最後更新時間: 2021年08月02日.