C#数组
数组是一个用来存储相同类型数据的、固定大小的、具有连续内存位置的顺序集合。数组中的每个元素都对应一个索引值,索引从 0 开始依次递增,我们可以通过索引来访问数组中的指定元素
假如我们要存储 100 名学生的分数,若使用普通变量的话可能需要定义 100 整型变量,例如 number0、number1、...、number99。而如果使用数组就简单的多了,只需要定义一个长度为 100 的整型数组,例如 numbers,然后使用 numbers[0]、numbers[1]、...、numbers[99]([ ]
中的数字就是数组的索引)就可以访问数组中的每个元素。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _02_数组 { internal class Program { static void Main(string[] args) { //一维数组是最简单并且最常用的一种数组 //1.数组的声明,声明数组类似声明变量,需要指定数组中存储的数据类型,一般数组变量的名称以复数的形式命名(加s) //格式:数据类型[] 变量名 int[] ints;//声明一个用于存储int类型的数组 char[] chars;//声明一个用于存储char类型的数组 //2.数组的初始化 //格式: 变量名=new 类型[数组的长度] ints = new int[2]; chars=new char[10]; //简写: double[] doubles=new double[10]; //错误写法 // double[10] doubles = new double[10]; //数组初始化之后,C#会自动在数组中填充对应类型的默认值进行站位 //数值类型的默认值是0 bool类型类型的默认值是false char类型的默认值是\0 string类型的默认值是null int[] ints1 = new int[10]; char[] chars1 = new char[10]; bool[] bools = new bool[10]; //我们也可以在初始化数组时候指定他的初始值 string[] names1 = new string[3] {"吴亦凡","罗志祥","李云迪"}; //如果初始化的时候指定了数组的初始值,那么就可以省略指定数组的长度,会自动根据数组的初始值判定数组的长度 string[] names2 = new string[] { "吴亦凡", "罗志祥", "李云迪" ,"李易峰"}; //数组的声明如果进行了初始化 可以省略 new 数据类型[] string [] names3 = { "吴亦凡", "罗志祥" }; //数组的操作 //数组中数据的操作都是基于索引的,索引从0开始,到数组的长度(Length)-1结束,用于访问数组中存储的数据 //数组中数据的读取: 数组名[索引] //数组中数据的设置: 数组名[索引]=值 names3[1] = "祥祥"; Console.WriteLine(names3[1]); //练习:定义一个长度为50的数组,其中存储50个偶数 int[] nums = new int[50]; //nums[0] = 0; //nums[1] = 2; //nums[2] = 4; for (int i = 0; i < nums.Length; i++) { nums[i] = i*2; } //数组的遍历 //1.可以使用for循环来遍历数组 for (int i = 0; i < nums.Length; i++) { Console.WriteLine($"数组的第{i}位的值是{nums[i]}"); } Console.WriteLine("--------------"); //2.还可以使用foreach进行遍历 //格式: foreach(数组中数据的类型 变量名 in 需要遍历的数组) foreach (int n in nums) { //n 表示数组中每一项数据 Console.WriteLine(n); } //需求:将nums数组中的每一项增加50 for (int i = 0; i < nums.Length; i++) { // nums[i] = nums[i] + 50; nums[i] += 50; } //foreach 优缺点: //优点:简洁 //缺点: //1.无法访问到当前数据的索引 //2.无法修改数组中的数据 //3.无法终止{无法使用break,continue 进行循环控制) } } }
类型分析
// 数组是引用类型 int[] ints3=new int[] {1,2,3}; int[] ints4 = ints3; ints4[0] = 666; Console.WriteLine(ints3[0]);
多维数组
多维数组(也可称为矩形数组),它可以是二维的,也可以是三维的,多维数组中的数据以类似表格(行、列)的形式存储,因此也被称为矩阵。
多维数组中最简单的形式是二维数组,我们可以将二维数组看作是一个表格,这个表格中具有相应的行数和列数,下图中展示了一个包含 3 行 4 列的二维数组。
使用arr[i, j]
的形式来访问二维数组中的每个元素,其中 arr 为数组的名称,而 i 和 j 则是数组元素的索引,类似于表格中的行和列
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _03_多维数组 { internal class Program { static void Main(string[] args) { //C#支持多维数组(矩阵数组),最简单的多维数组,就是二维数组 // 一个二维数组的定义可以被认为是一个带有行和列的表格 //多维数组的声明: //1.二维数组: //数据类型[,] 变量名 = new 数据类型[2,3] //2.三维数组: //数据类型[,,] 变量名 =new 数据类型[2,4,4] //3.四维数组: //数据类型[,,,] 变量名 =new 数据类型[1,2,4,1] //... //N维数组 //数据类型[N-1个逗号] 变量名 =new 数据类型[每一个维度的长度] //一维数组的初始化 int[] ints1 = new int[3] { 66, 777, 888 }; //多维数组初始化 //二维数组 int[,] ints2 = new int[4, 4] { {1, 222, 3, 4}, {1, 2, 31, 4}, {1, 20, 3, 4}, {1, 2, 3, 4} }; //三维 int[,,] ints3 = new int[3, 4, 2] { { { 2, 1 }, { 2, 1 }, { 2, 1 }, { 2, 1 }, }, { { 2, 1 }, { 2, 1 }, { 2, 1 }, { 2, 1 }, }, { { 2, 1 }, { 2, 1 }, { 2, 1 }, { 2, 1 }, }, }; string[,] strings1 = new string[,] { {"a","b","c" }, {"aa","bb","cc" }, {"aaa","bbb","ccc" } }; Console.WriteLine(strings1[0, 0]); Console.WriteLine(strings1[0, 1]); Console.WriteLine(strings1[1, 0]); strings1[1, 0] = "99999999999"; Console.WriteLine(strings1[1, 0]); string[,] strings2 = new string[5, 10]; //strings2[0, 0] = "行:0,列:0"; //strings2[0, 1] = "行:0,列:1"; //strings2[0, 2] = "行:0,列:2"; for (int i = 0; i < 5; i++) { for (int j = 0; j < 10; j++) { strings2[i, j] = $"行:{i},列:{j}"; } } strings2[3, 7] = "吴亦凡"; //遍历 //多维数组的遍历 foreach可以循环获取每一项的值 无论数组是几维的 foreach (string v in strings2) { Console.WriteLine(v); } //Length 获取到的是各个维度存储的数据的总长度(数据的总个数) Console.WriteLine(strings2.Length);//50 Console.WriteLine(strings2.GetLength(0));//获取多维数组中第一个维度的长度 Console.WriteLine(strings2.GetLength(1));//获取多维数组中第二个维度的长度 for (int i = 0; i < strings2.GetLength(0); i++) { for (int j = 0; j < strings2.GetLength(1); j++) { Console.WriteLine(strings2[i, j]); } } //定义一个二维数组 叫做arr arr[0,3]=>>10 arr[1,2]=>>20 arr[2,2] =>>30 int[,] arr = new int[3, 4] { { 0, 0, 0, 10 }, { 0, 0, 20, 0 }, { 0, 0, 30, 0 } }; } } }
交错数组
交错数组其实就是元素为数组的数组,换句话说就是交错数组中的每个元素都可以是维度和大小不同的数组,所以有时交错数组也被称为“数组的数组”。
交错数组和多维数组的区别在于,交错数组的每一行的长度可以不同
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _04_交错数组 { internal class Program { static void Main(string[] args) { int[,] ints = new int[,] { { 1,2, 3, 4, }, { 5,6, 7, 8, }, }; //交错数组:就是装着数组的数组,交错数据存储的也是数组 //交错数组和多维数组的区别: 交错数组的每一项长度都可以不同 //交错数组的定义: int[] ints1;//一层交错数组, 就是普通的一维数组 int[][] ints2; //二层交错数组 ,数组中装着一层交错数组 int[][][] ints3; //三层交错数组,数组中装着二层交错数组 int[] ints4 = new int[] { 1, 2, 3 }; int[][] ints5 = new int[][] { new int[] { 1, 2}, new int[] { 1, 2}, new int[] { 1, 2} }; int[][][] ints6 = new int[][][] { new int[][] { new int[] { 1, 2}, }, }; int[] ints7_1 = new int[] { 1, 2, 3 }; int[] ints7_2 = new int[] { 4, 5 }; int[] ints7_3 = new int[] { 6, 7, 8 }; int[] ints7_4 = new int[] { 9 }; int[][] ints7 = new int[][] { ints7_1, ints7_2, ints7_3, ints7_4, }; // int[] arr = ints7[0]; //arr[1] //交错数组 通过 数组名[第一层的索引][第二层的索引] Console.WriteLine(ints7[0][1]); ints7[0][2] = 9999; Console.WriteLine(ints7[0][2]); //属性 //交错数组的Length属性 表示交错数组中 数组的个数 Console.WriteLine(ints7.Length); Console.WriteLine(ints7[1].Length); //遍历 //交错数组其实就是数组里面村数组,可以使用foeach 一层一层循环 foreach (int[] v in ints7) { foreach (int vv in v) { Console.WriteLine(vv); } } for (int i = 0; i < ints7.Length; i++) { //ints7[0] == new int[] { 1, 2, 3 } //ints7[1] == new int[] { 4, 5 }; for (int j = 0; j < ints7[i].Length; j++) { Console.WriteLine(ints7[i][j]); } } } } }
数组的属性
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _05_数组的属性 { internal class Program { static void Main(string[] args) { //所有的数组都是Array类的实例,Array类提供了一系列属性和方法 //Length int[] ints = { 1, 2, 3 }; int[,,] ints2 = { { {1,2 }, {1,2}, {1,2}, }, { {1,2 }, {1,2}, {1,2}, }, { {1,2 }, {1,2}, {1,2}, } }; Console.WriteLine(ints.Length);//返回的是一个32位的整数,表示数组的长度 Console.WriteLine(ints.LongLength);//返回一个64位的整数,表示数组的长度 Console.WriteLine(ints.Rank);//返回数组的维度 Console.WriteLine(ints2.Rank); } } }