4.1 数组

devtools/2025/3/9 8:52:03/

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的

4.1.1 数组基础

数组是一组逻辑上相互关联的值,所有的数组都是Array类,Array提供的属性和方法都适用。

例如一所小学X年级X班的40个学生:

学生1 学生2 学生3 学生4 。。。。学生40

我们可以用序号来给每个学生编号,那么这个数组就是学生(),数组名称为“学生”,后面有个括号表示这是一个数组

数组的定义,一般不会直接使用:

Array 数组名称;

通常使用下面的语句:

数据类型[] 数组名称;

例如:

string[] students;

如果需要定义时候初始化数组大小,应该使用以下代码:

string[] students = new string[40];

注意:C#中数组的索引范围是从0开始,n-1结束,一共n个索引。以上代码定义了一个拥有40个学生的数组,成员为student[0]至student[39]。

注意:C#不像VB.Net一样能直接设置数组大小,例如

string[40] students;

是错误的,而VB.Net中可以直接使用:

Dim 学生姓名(39) As String

来设置数组大小。

另外一种定义数组大小的方法是直接在定义的时候赋值,例如以下代码:

string[] students = new string[] { "赵柯", "钱廷军", "张强", "王睿", "李军", "周国轩", "郑蕾", "王海" };

以上代码定义了一个大小为8(最大索引为7)的数组,并同时给数组元素赋了值。

获得数组中某个元素的值很简单,只需要传入数组名称[索引号]就可以了。例如以下代码将显示数组中的第2个(索引号为1)学生的姓名:

Console.WriteLine(students[1]);

另外,以下代码声明了一个空数组

string[] students={ };

数组可以避免空引用异常,如果要给空数组赋值,可以先使用Array.Resize来扩大数组,然后再赋值。

【例 4.1【项目:code4-001】使用For循环给数组元素赋值。

        static void Main(string[] args)

        {

            string[] students={ };

            int arrSize = 40;

            Array.Resize(ref students, arrSize);

            //在知道数组大小的情况下,也可以直接使用:

            //string[] students=new string[40];

            //循环给学生姓名赋值

            for (int i = 0; i < 40; i++)

                students[i] = "姓名" + i.ToString();

            //输出索引为1的学生姓名

            Console.WriteLine("students(1)对应的值是 " + students[1]);

            Console.ReadKey();

    }

运行结果如下图所示:

图4-1 给学生数组赋值

通过Array类的Resize()方法可以扩大或者缩小数组内元素的数量,当使用Resize方法缩小或扩大数组后将保留原有数据,扩大数组时多出的元素将被置为null。

【例 4.2【项目:code4-002】使用Resize方法扩大数组

        static void Main(string[] args)

        {

            string[] students = new string[] { "赵柯", "钱廷军", "张强", "王睿", "李军", "周国轩", "郑蕾", "王海" };

            Console.WriteLine("学生数量:" + students.Length);

            //遍历并输出数组中的元素

            foreach (string student in students)

                Console.Write(student + " ");

            Console.WriteLine();

            //数组在原有基础上增加2,并保留原有数据

            Array.Resize(ref students, students.Length + 2);

            students[8] = "方国溪";

            students[9] = "刘韬";

            Console.WriteLine("学生数量:" + students.Length);

            foreach (string student in students)

                Console.Write(student + " ");

            Console.ReadKey();

        }

运行结果如下图所示:

图4-2 使用Resize扩大数组元素

4.1.2 多维数组

假设一维数组是一条线上的一个点,它只具有一个索引就可以确定位置;

那么二维数组就是一个平面上的一个点,那么它需要两个索引来确定位置;

三维数组就是立体上的一个点,需要三个索引来确定位置;

四维数组就得还加上一个点;

依次类推。。。。

当然一般人对维度的理解有限,实际生活中也就关心的是三维空间(长、宽、高),有些人关注的多一点,关注四维空间(长、宽、高、时间);再更少更少的人,关注更多维空间,维度越多也就越复杂。

多维数组的声明是在括号内加入“,”(英文逗号),二维加入一个逗号,三维加入两个逗号,以此类推。例如下面的代码定义了一个三维数组

Dim schoolStudents(2, 4, 39) As String

schoolStudents数组表示一个学校,其中第一个维度表示学校一共3个年级,第二个维度表示每个年级5个班级,第三个维度表示每个班40个学生。

也可以使用以下的定义:

Dim schoolStudents(,,) As String

ReDim schoolStudents(2, 4, 39)

多维数组也可以在定义的时候赋值,同时定义了数组大小。以下代码定义了一个二维数组,每一维的大小为3:

Dim students2(,) As String = {{"赵柯", "钱廷军", "张强"}, {"学生甲", "学生乙", "学生丙"}}

由于三维及三维以上数组的复杂度较高,理解和操作较难,本节重点以二维数组为例。

在4.1.1节的时候,笔者举例了一个班的学生来学习数组,如果以一个年级学生为例,假设班级序号为一个维度,学生序号为一个维度,就构成了二维数组

以下定义了XX学校1年级的学生姓名数组

该年级共4个班,每个班40个学生:

        Dim students(4, 39) As String

        students(0, 0) = "赵柯"

        students(0, 1) = "钱廷军"

        students(0, 2) = "张强"

        ……

        students(1, 0) = "陈廷"

        students(1, 1) = "汪明睿"

        students(1, 2) = "代晓杰"

        ……

Students数组的第一个维度是班级序号,第二个维度是班级上的学生序号。

【例 4.3【项目:code4-003】遍历班级学生。

        static void Main(string[] args)

        {

            //string[,,] schoolStudents = new string[2, 4, 39];

            //简化起见,年级的班级缩小到了3个,每个班学生4人。

            string[,] students = new string[3, 4];

            students[0, 0] = "赵柯";

            students[0, 1] = "钱廷军";

            students[0, 2] = "张强";

            students[0, 3] = "王睿";

            students[1, 0] = "陈廷";

            students[1, 1] = "汪明睿";

            students[1, 2] = "代晓杰";

            students[1, 3] = "庄慧云";

            students[2, 0] = "袁宝军";

            students[2, 1] = "秦天";

            students[2, 2] = "龚国杰";

            students[2, 3] = "郑贺";

            string classStudents;

            for(int i = 0;i< 3;i++)

            {

                classStudents = "";

                for (int j = 0; j < 4; j++)

                    classStudents += students[i, j] + " ";

                Console.WriteLine("一年级" + (i + 1).ToString() + "班学生有:" + classStudents);

            }

            Console.ReadKey();

        }

运行结果如下图所示:

图4-3遍历班级学生

4.1.3 常用属性

数组总的大小(也就是数组里面所有元素的数量)可以使用Length属性获得。

数组某维的大小(也就是数组某一维元素的数量)可以使用GetLength(维序号)方法获得。

数组的维数(秩),可以使用Rank属性获得。

【例 4.4【项目:code4-004】获得数组维数信息。

        static void Main(string[] args)

        {

            string[,] students = new string[,] {

                {"赵柯", "钱廷军", "张强", "王睿"},           

                {"陈廷", "汪明睿", "代晓杰", "庄慧云"},           

                {"袁宝军", "秦天", "龚国杰", "郑贺"}

            };

            int arrayRankSize = students.Rank;

            Console.WriteLine("总的维数为:" + arrayRankSize);

            Console.WriteLine("数组元素总数:" + students.Length);

            int[] ranks = new int[arrayRankSize];

            //得到每个维度的大小

            for(int i =0;i< arrayRankSize;i++)

                Console.WriteLine("" + (i + 1) + "维的大小:" + students.GetLength(i));

            Console.ReadKey();

        }

运行结果如下图所示:

图4-4 数组维数信息

4.1.4 数组的合并

方法1:按照多个数组的大小重新定义一个新的数组,使用循环将旧数组的值写入新数组

【例 4.5【项目:code4-005】合并数组

        static void Main(string[] args)

        {

            string[] studentsClass1 = { "赵柯", "钱廷军", "张强", "王睿" };

            string[] studentsClass2 = { "陈廷", "汪明睿", "代晓杰", "庄慧云" };

            string[] studentsClass3 = { "袁宝军", "秦天", "龚国杰", "郑贺" };

            //定义一个数组,大小为上述三个数组的大小之和-1

            string[] studentsAll = new string[studentsClass1.Length + studentsClass2.Length + studentsClass3.Length ];

            for(int i = 0;i< studentsAll.Length;i++)

            {

                //加入第1数组数据

                if (i < studentsClass1.Length)

                    studentsAll[i] = studentsClass1[i];

                //加入第2数组数据

                if ((i >= studentsClass1.Length) && (i < studentsClass1.Length + studentsClass2.Length))

                    studentsAll[i] = studentsClass2[i - studentsClass1.Length];

                //加入第3数组数据

                if( i >= studentsClass1.Length + studentsClass2.Length )

                    studentsAll[i]= studentsClass3[i - studentsClass2.Length - studentsClass1.Length];

            }

            for(int i= 0;i< studentsAll.Length;i++)

            {

                Console.Write(studentsAll[i] + " ");

                if ((i+1) % 4 == 0)

                    Console.WriteLine();

            }

            Console.ReadKey();

    }

运行结果如下图所示:

图4-5 数组合并

方法2:使用Array类的Copy方法将旧数组的值拷贝到新数组,其中常用的两个重载版本:

Public Shared Sub Copy ( sourceArray As Array, destinationArray As Array, length As Integer )

参数说明:

  1. sourceArray:源数组
  2. destinationArray:目标数组
  3. length:复制的元素数目。

Public Shared Sub Copy ( sourceArray As Array, sourceIndex As Integer, destinationArray As Array, destinationIndex As Integer, length As Integer )

参数说明:

  1. sourceArray:源数组
  2. sourceIndex:源数组中复制开始处的索引。
  3. destinationArray:目标数组
  4. destinationIndex:目标数组中存储开始处的索引。
  5. length:复制的元素数目。

【例 4.6【项目:code4-006】合并数组

        static void Main(string[] args)

        {

            string[] studentsClass1 = { "赵柯", "钱廷军", "张强", "王睿" };

            string[] studentsClass2 = { "陈廷", "汪明睿", "代晓杰", "庄慧云" };

            string[] studentsClass3 = { "袁宝军", "秦天", "龚国杰", "郑贺" };

            string[] studentsAll= { };

            //重新定义studentsAll数组大小为以上三个数组大小之和

            Array.Resize(ref studentsAll, studentsClass1.Length + studentsClass2.Length + studentsClass3.Length);

            //studentsClass1拷贝studentsClass1长度的元素到studentsAll

            Array.Copy(studentsClass1, studentsAll, studentsClass1.Length);

            //studentsClass20索引处,拷贝studentsClass2长度的元素,到studentsAllstudentsClass1.Length索引处

            Array.Copy(studentsClass2, 0, studentsAll, studentsClass1.Length, studentsClass2.Length);

            Array.Copy(studentsClass3, 0, studentsAll, studentsClass1.Length + studentsClass2.Length, studentsClass3.Length);

            for (int i = 0; i < studentsAll.Length; i++)

            {

                Console.Write(studentsAll[i] + " ");

                if ((i + 1) % 4 == 0)

                    Console.WriteLine();

            }

            Console.ReadKey();

    }

运行结果同【例 4.5】。

4.1.5 常见错误

使用数组的时候,比较常见的问题:索引超出了数组界限。

【例 4.7【项目:code4-007】合并数组

        static void Main(string[] args)

        {

            string[,] students = new string[2, 3];

            for (int i = 0; i < 2; i++)

                for (int j = 0; j < 4; j++)

                    students[i, j] = (i + 1) + "班第" + (j + 1) + "号学生";

        }

由于我们定义的数组中班级学生最多为4个,现在超过了4个,运行时VB.Net就会提示错误:

图4-6 索引超出了数组界限

解决方法就是确保使用的数组元素的索引一定要在数组大小范围内。将的代码中:

for (int j = 0; j < 4; j++)

修改为:

for (int j = 0; j < 3; j++)

确保在数组有效范围即可。

学习更多vb.net知识,请参看vb.net 教程 目录

学习更多C#知识,请参看C#教程 目录


http://www.ppmy.cn/devtools/165717.html

相关文章

如何优化FFmpeg拉流性能及避坑指南

FFmpeg作为流媒体处理的核心工具&#xff0c;其拉流性能直接影响直播/点播体验。本文从协议优化、硬件加速、网络策略三大维度切入&#xff0c;结合实战案例与高频踩坑点&#xff0c;助你突破性能瓶颈&#xff01; 一、性能优化进阶&#xff1a;从协议到硬件的全链路调优 协议选…

Luno Api - AI音乐开发「人声伴奏分离 – 自定义音频」「Luno Api系列|AI音乐API」第7篇

导读 今天来看下Luno Api的人声伴奏分离。 人声伴奏分离顾名思义就是将人声和伴奏&#xff08;乐器&#xff09;的声音分离成两个音频文件。 这个功能对于各大音乐平台要证明是原创有很大的作用&#xff0c;所以这个功能相当的重要。 上一节是对于已经创作的歌曲进行分离&a…

代码随想录算法营Day59 | 寻找存在的路径, 冗余连接,冗余连接II

寻找存在的路径 这题使用并查集即可。并查集加路径压缩。 #include <iostream> using namespace std; int find(int* father,int u){return father[u] u ? u : father[u] find(father,father[u]); }bool isSame(int* father,int u,int v){return find(father,u) fi…

GitHub上传项目

总结&#xff08;有基础的话直接执行这几步&#xff0c;就不需要再往下看了&#xff09;&#xff1a; git init 修改git的config文件&#xff1a;添加:[user]:name你的github用户名 email你注册github的用户名 git branch -m master main git remote add origin 你的URL gi…

【深度学习】pet_breeds图像分类

宠物品种数据集 这里我们使用fastai深度学习库。 from fastai.vision.all import *从fastai的官网下载Pets数据集&#xff0c;解压至本地文件夹内。 path untar_data(URLs.PETS) Path.BASE_PATH path path.ls()制作宠物品种标签 annotations目录内的文件主要告诉了我们宠…

【每日学点HarmonyOS Next知识】Web交互、列表拖拽、横屏后布局、Event序列问题、Scroll与Web组合

1、HarmonyOS list组件如何设置匀速滑动&#xff1f; edgeEffect.None 这个属性是设置边缘滑动效果&#xff0c;支持弹簧效果和阴影效果。 friction&#xff1a;设置摩擦系数&#xff0c;手动划动滚动区域时生效&#xff0c;只对惯性滚动过程有影响&#xff0c;对惯性滚动过程…

【Manus资料合集】激活码内测渠道+《Manus Al:Agent应用的ChatGPT时刻》(附资源)

DeepSeek 之后&#xff0c;又一个AI沸腾&#xff0c;冲击的不仅仅是通用大模型。 ——全球首款通用AI Agent的破圈启示录 2025年3月6日凌晨&#xff0c;全球AI圈被一款名为Manus的产品彻底点燃。由Monica团队&#xff08;隶属中国夜莺科技&#xff09;推出的“全球首款通用AI…

P8781 [蓝桥杯 2022 省 B] 修剪灌木

P8781 [蓝桥杯 2022 省 B] 修剪灌木 题目 解析代码 题目 解析 求每棵树最多能张多高&#xff0c;那就得想什么情况下&#xff0c;这颗树能张到最大高度。 没错没错&#xff0c;就是你刚剪完他这个情况下&#xff0c;下一次他就达到最大高度&#xff0c;那么就算他距离边界的最…