一、数组核心概念
数组是存储相同类型数据的容器,所有数组都基于 Array 类实现。
数组核心特性:
-
长度固定:数组创建后,大小无法修改
-
有序存储:元素按照存入顺序排列
-
索引(下标)操作:所有元素通过索引读写
-
索引规则:索引从 0 开始,长度从 1 开始;最大索引 = 数组长度 - 1
二、数组定义与各类数组默认值
定义语法:数据类型[] 数组名;
命名规范:数组变量名一般加 s 后缀(names、ages、sexs)
cs
int[] ages; // 整型数组,默认值:0
bool[] sexs; // 布尔数组,默认值:false
string[] names; // 字符串数组,默认值:null
char[] chars; // 字符数组,默认值:\0(空字符)
三、数组四种赋值/初始化方式
cs
// 方式1:指定长度,创建空数组
int ages = new int[10];
// 方式2:指定长度 + 初始化所有元素
string names = new string[5] { "张三", "张三", "张三", "张三", "张三" };
// 方式3:不指定长度,长度由元素个数自动确定
int ages = new int[] { 1, 2, 3 };
// 方式4:字面量简写(最常用)
int[] nums = { 1, 2, 3 };
四、数组基础增删改查操作
1. 创建固定长度数组
cs
// 创建长度为100的空字符串数组
string[] msgs = new string[100];
2. 单个元素赋值(通过下标)
cs
msgs[0] = "张三";
msgs[1] = "搜索";
// 报错!索引超出数组界限
// msgs[100] = "ss";
易错点:数组长度100,合法索引范围为 0~99,超出范围直接报错
3. 循环批量赋值
借助 数组名.Length 获取数组总长度,实现全自动批量赋值
cs
for (int i = 0; i < msgs.Length; i++)
{
msgs[i] = i + "深度";
}
4. 单个元素取值
cs
// 取出最后一个元素
Console.WriteLine(msgs[99]);
五、数组两种遍历方式(重点)
1. for 循环遍历
优势:可以获取元素索引下标,支持修改数组元素
cs
for (int i = 0; i < msgs.Length; i++)
{
Console.WriteLine(msgs[i] + "--------");
}
2. foreach 循环遍历
语法:foreach(元素类型 变量名 in 数组)
item 等价于数组中当前遍历到的 msgs[i]
cs
foreach (string item in msgs)
{
Console.WriteLine(item + "++++");
}
3. for 与 foreach 核心区别(必背)
-
foreach :写法简单,仅用于读取数据;缺点:无法获取元素索引、无法修改元素位置
-
for :写法稍繁琐,可以获取索引,支持修改数组元素,功能更全面
六、object 万能数组(存储不同类型数据)
普通数组只能存储单一类型 数据,object 是所有数据类型的父类,可存储任意类型数据(int、string、bool 等)。
拓展:实际开发中存储多类型数据,优先使用 ArrayList、List 集合,不推荐频繁使用 object 数组。
cs
// 存储int、string、bool多种类型
object[] arr = new object[5] { 1, 2, 3, "张三", true };
// 遍历万能数组
foreach (object item in arr)
{
Console.WriteLine(item);
}
// 直接打印数组名,输出:System.Object[]
Console.WriteLine(arr);
注意:object 类型数据无法直接运算,需要强制类型转换后才能操作
七、数组核心易错点总结
-
数组长度固定,初始化后不能扩容、缩容
-
索引从 0 开始,最大索引 = 数组长度 - 1,超出范围报索引越界错误
-
值类型数组默认值为0/false,引用类型数组默认值为null
-
foreach 仅可读不可改,需要操作下标必须用 for 循环
-
直接打印数组变量名,只会输出数组类型名称,不会输出元素内容
八、数组标准模板
cs
// 1. 定义并初始化数组
int[] nums = new int[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// 2. 赋值
nums[3] = 10;
// 3. for遍历
for (int i = 0; i < nums.Length; i++)
{
Console.WriteLine(nums[i]);
}
// 4. foreach遍历
foreach (int item in nums)
{
Console.WriteLine(item);
}
九、拓展实战:随机昵称生成器(一维数组随机取值)
cs
// 姓氏库、名字库
string[] xings = { "赵", "钱", "孙", "李", "诸葛", "夏侯", "东方", "欧阳" };
string[] names1 = { "亮", "娜娜", "月初", "惇", "匡胤", "多多", "权", "世民" };
Random rnd = new Random();
// 随机下标:范围 0 ~ 数组长度-1
int index = rnd.Next(0, xings.Length);
int index1 = rnd.Next(0, names1.Length);
// 拼接随机昵称
Console.WriteLine(xings[index] + names1[index1]);