VB.NET学习笔记:数据类型——数组的定义和使用(动态数组、二维数组)

VB.NET学习笔记 专栏收录该内容
27 篇文章 9 订阅

官方帮助页面:Visual Basic 中的数组

VB.NET中,可以使用变量储存数据,例如储存学生姓名:

dim strname as string="张三"

可以声明多个变量来储存三年级1班全部学生姓名,为了方便,给每个学生编了号:

dim 三年级1班_1 as string="张三"
dim 三年级1班_2 as string="李四"
dim 三年级1班_3 as string="王五"
dim 三年级1班_4 as string="麻二"
……

虽然可行,但很麻烦,而且使得代码难以维护和扩展,万一该班学生有增减则需要对应用程序进行修改、 重新编译和重新部署。

一、一维数组

通过使用一个数组,可以通过相同的名称、不同的索引来储存和访问以上的多个变量:

        '声明
        Dim 三年级1班(3) As String

        '赋值
        三年级1班(0) = "张三"
        三年级1班(1) = "李四"
        三年级1班(2) = "王五"
        三年级1班(3) = "麻二"

        '访问
        For int As Integer = 0 To 3
            Console.WriteLine("三年级1班" & (int + 1).ToString & "号学生的姓名:  " & 三年级1班(int))
        Next

测试结果如图:
在这里插入图片描述
该示例执行三项操作:
1、它声明了一个具有4个元素的数组“三年级1班(3)”。 声明数组中括号里的数字3表示数组中的最后一个索引。
2、它将值赋给数组中的每个元素。 通过使用数组名称并在括号中包含单个元素的索引访问数组元素。
3、它列出了数组的每个值。 该示例使用 For 语句按索引号来访问数组的每个元素。

二、二维数组

如果需要储存三年级全部班级的学生姓名,可以使用二维数组,这跟Excel存储数据很相似。
在这里插入图片描述
Excel以二维表的方式存储数据,工作表名“三年级”相当于数组名称,每行存储一个班级的学生姓名,单元格地址(如:C3,也可以用数字[3,3]表示)相当于数组元素的索引。
通过“工作表名(行号,列号)”访问Excel数据,如:三年级(3,3),二维数组也是按这样的方法访问数组里的元素。如下代码:

    '声明一个3行4列二维数组
        Dim 三年级(2, 3) As String

        '为第一行的各列赋值(1班学生姓名)
        三年级(0, 0) = "张三"
        三年级(0, 1) = "李四"
        三年级(0, 2) = "王五"
        三年级(0, 3) = "麻二"
        '为第二行的各列赋值(2班学生姓名)
        三年级(1, 0) = "赵钱"
        三年级(1, 1) = "孙小"
        三年级(1, 2) = "王二"
        三年级(1, 3) = "秦大"
        '为第三行的各列赋值(3班学生姓名)
        三年级(2, 0) = "李一"
        三年级(2, 1) = "赵二"
        三年级(2, 2) = "钱三"
        三年级(2, 3) = "孙四"

        '访问
        For int1 As Integer = 0 To 2 '行
            For int2 As Integer = 0 To 3 '列
                Console.WriteLine("三年级" & (int1 + 1).ToString & "班第" & (int2 + 1).ToString & "号学生的姓名:  " &
                                  三年级(int1, int2) & "  ,索引号为: (" & int1.ToString & "," & int2.ToString & ")")
            Next
        Next

测试结果如图:
在这里插入图片描述
可见,使用数组比直接声明多个变量更简单,那到底什么是数组呢?

三、数组的概念

数组其实就是一个特殊的变量,其表示一组数据的集合。在 VB.net中,允许将多个类型相同或者不相同的数据组合成一个集合,它们有共同的变量名,然后用其索引号访问其每个元素,该集合称为数组。

1、数组的声明

使用数组,首先应声明数组。数组的声明与声明一个单独的变量相似:

        '声明变量
        Dim arr As String

        '声明一维数组
        Dim arr1(3) As String

        '声明二维数组
        Dim arr2(2, 3) As String

        '声明三维数组
        Dim arr3(2, 2, 3) As String

数组的声明比变量的声明多了一个括号,括号里写上该数组的最大索引号;若是声明二维或多维数组,各维最大索引号数字用逗号分割。
除了可以用Dim关键字声明数组外,声明数组还可以使用Public或Private关键字。声明使用的关键字不同将会影响数组的生命周期,Dim关键字主要用于声明过程级别的私有数组,Private关键字用于声明模块级或类级别的数组,Public关键字则是在模块的声明部分建立一个公共数组,这跟变量的作用域相似。
旧VB6.0数组索引号的开始值可以由编程者定义(如 -1 TO 5),但VB.NET数组的索引总是从0开始到最大索引号的连续整数,也就是说数组元素的个数总是比最大索引号多1,所以声明时不需要也不能用TO关键字来声明索引号范围。
还可以使用New子句来声明数组:

        '一维
        Dim cargoWeights() As Double = New Double(9) {}
        '二维
        Dim hourlyTemperatures(,) As Integer = New Integer(23, 1) {}
        '三维
        Dim januaryInquiries(,,) As String = New String(30, 20, 2) {}

使用New子句时必须使用大括号{},且不能在数组变量声明中指定维的长度。

2、数组的赋值

声明数组后,就可以通过索引号来引用数组中的元素,为数组赋值或访问数组中元素,以上已有说明,这里略过。
也可以声明数组的同时为数组赋值。
一维数组:

        Dim str1 As String() = {"%", "&", "@"}
        Dim str2() As String = {"%", "&", "@"}
        Dim str3 As String() = New String(2) {"%", "&", "@"}
        Dim str4() As String = New String(2) {"%", "&", "@"}

需要注意:1、提供的元素值必须包含在大括号 {}内;2、不能在数组变量声明中指定维的长度。数组会根据元素值的数量推断数组的大小。
每个语句执行后,将创建的数组长度为 3、索引号从0 到 2、已赋初始值的数组。
二维数组:

        Dim str1 As String(,) = {{"0-0", "0-1", "0-2"}, {"1-0", "1-1", "1-2"}, {"2-0", "2-1", "2-2"}}
        Dim str2(,) As String = {{"0-0", "0-1", "0-2"}, {"1-0", "1-1", "1-2"}, {"2-0", "2-1", "2-2"}}
        Dim str3 As String(,) = New String(2, 2) {{"0-0", "0-1", "0-2"}, {"1-0", "1-1", "1-2"}, {"2-0", "2-1", "2-2"}}
        Dim str4(,) As String = New String(2, 2) {{"0-0", "0-1", "0-2"}, {"1-0", "1-1", "1-2"}, {"2-0", "2-1", "2-2"}}

提供的元素值必须嵌套在大括号{}内 。 {“0-0”, “0-1”, “0-2”}这个表示第1行,“0-0"表示第1行第1列的值为"0-0”。如图:
在这里插入图片描述

3、数组的属性与方法

每个数组都继承自 System.Array 类,可以使用System.Array 类提供一些属性和方法,用于获取数组维数、大小、最大索引号等。
(1)、Rank属性
获取 数组的维数。 例如,一维数组返回 1,二维数组返回 2,依次类推。
(2)、Length和LongLength属性
获取所有维数中元素的总数。Length返回32位整数,LongLength返回64位整数。
(3)、GetLength和GetLongLength方法
获取数组中指定维中的元素数。GetLength返回32位整数,GetLongLength返回64位整数。
(4)、GetLowerBound方法
获取数组中指定维度第一个元素的索引。返回32位整数。
(5)、GetUpperBound方法
获取数组中指定维度最后一个元素的索引(32位整数)。如果指定维度为空则返回-1。
示例代码:

        Dim arr(,) As String = {{"0-0", "0-1", "0-2"}, {"1-0", "1-1", "1-2"}, {"2-0", "2-1", "2-2"}}
        Dim intRank As Integer = arr.Rank '获取维数
        Dim intLength As Integer = arr.Length '获取所有维数中元素的总数

        '嵌套循环每一维度(从第一个元素索引号到最后一个元素索引号)
        For int1 As Integer = arr.GetLowerBound(0) To arr.GetUpperBound(0)
            For int2 As Integer = arr.GetLowerBound(1) To arr.GetUpperBound(1)
                Console.WriteLine("(" & int1.ToString & "," & int2.ToString & ")    " & arr(int1, int2))
            Next
        Next
        
        '也可以不使用嵌套循环获取元素值
        For Each arr1 As String In arr
            Console.WriteLine(arr1)
        Next

还有很多的其他方法请自行参考官方帮助。

三、动态数组

有时在程序运行之前无法确认数组的大小,需要在程序运行时动态决定数组大小,称为动态数组。

1、动态数组的声明

跟一般的数组声明一样,只是在括号内不必填写各维的最大索引号(留空)。如

        '声明一维动态数组
        Dim arr1() As Integer
        '声明二维动态数组
        Dim arr2(,) As Integer

声明动态二维数组需要在括号里用,号,这跟旧VB6.0的声明不一样,旧VB6.0不需要关心维数,只要是动态数组都是如下声明:

         '声明动态数组(一维、二维等)
        Dim arr1() As Integer

2、使用ReDim语句动态分配数组大小

使用 ReDim 语句可以更改某个已声明数组的一个或多个维度的大小。语法:
ReDim [ Preserve ] name(boundlist) [ , name(boundlist) [, … ] ]
参数:
Preserve ——可选。 修饰符,当仅更改最后一个维度的大小时,用来保留现有数组中的数据。
name——必须的。 数组变量的名称。 请参阅声明的元素名称。
boundlist——必须的。 列出重新定义的数组各个维度的边界。

        '分配大小
        ReDim arr1(1)
        ReDim arr2(1, 1)

仅可在过程级别使用 ReDim语句,ReDim 语句可以改变各维元素的个数,但无法更改数组变量或其元素的数据类型,也不能更改数组的维数,更无法为数组元素提供新的初始化值(使用数组元素的数据类型的默认值来初始化这些元素)。
如果想改变数组的大小但又想保留原有数据,可以使用 Preserve,但只能调整数组最后一个维度的大小。 对于其他每个维度,必须指定现有数组的边界。如:

        ReDim Preserve arr1(2)
        ReDim Preserve arr2(1, 2)

关于用或不用Preserve关键字的区别,请看以下完整示例代码:

        '声明一维动态数组
        Dim arr1() As Integer
        '声明二维动态数组
        Dim arr2(,) As Integer

        '分配大小
        ReDim arr1(1)
        ReDim arr2(1, 1)

        '赋值
        For Each int As Integer In arr1
            arr1(int) = int + 1
        Next

        For int1 As Integer = 0 To arr2.GetUpperBound(0)
            For int2 As Integer = 0 To arr2.GetUpperBound(1)
                arr2(int1, int2) = int1 + int2
            Next
        Next

        '重新分配大小,请单步执行,观察Preserve关键字的作用
        ReDim Preserve arr1(2)
        ReDim Preserve arr2(1, 2)
        ReDim arr1(3)
        ReDim arr2(2, 3)

四、使用数组的注意事项

1、维度长度:
每个维度的索引是基于 0 的这意味着其范围为 0 到其上限之间。 因此,给定维度的长度为一个大于该维度的声明的上限。
2、长度限制:
每一维数组的长度限制为的最大值Integer数据类型,即Int32.MaxValue或 (2 ^31)-1。 但是,数组的总大小还受到系统上可用的内存限制。 如果尝试初始化数组超出可用内存量,则运行时会引发OutOfMemoryException。
3、大小和元素大小:
数组的大小独立于其元素的数据类型。 大小始终表示元素 (不所占用的内存的字节数) 的总数。
4、内存消耗:
做出关于数组如何存储在内存中的假设是不可靠的。 由于不同数据宽度的平台上的存储会有所变化,因此同一数组在 64 位系统上可以占用比在 32 位系统上更多的内存。 具体取决于数组初始化时的系统配置,公共语言运行时 (CLR) 可以尽可能地将存储分配到靠近包元素的地方,或者将它们全部在自然硬件边界上对齐。 此外,数组需要存储开销的控制信息,而且每添加一个维度,这种开销随之增加。
5、维度限制:
除一维、二维数组外,还有三维、四维……,在 Visual Basic.NET中,数组的维度最多不超过32。

  • 7
    点赞
  • 1
    评论
  • 34
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

zyjq52uys

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值