在 C# 中,数组是一种用于存储固定大小的相同类型元素的集合。数组可以包含值类型、引用类型或对象类型的元素,并且在内存中是连续存储的。以下是关于 C# 数组的详细介绍:
1. 一维数组
声明与初始化
// 声明数组
int[] numbers; // 声明但未初始化
int[] scores = new int[5]; // 初始化长度为5的数组(默认值为0)
// 声明并初始化元素
string[] names = new string[3] { "Alice", "Bob", "Charlie" };
int[] primes = { 2, 3, 5, 7, 11 }; // 简化语法
访问与修改元素
int[] arr = new int[3];
arr[0] = 100; // 设置元素
int value = arr[0]; // 获取元素(索引从0开始)
数组长度
int length = arr.Length; // 获取数组长度(只读属性)
2. 多维数组
二维数组
// 声明与初始化
int[,] matrix = new int[3, 4]; // 3行4列的矩阵
int[,] table = { {1,2}, {3,4}, {5,6} }; // 3行2列
// 访问元素
matrix[0, 1] = 10; // 第1行第2列
int val = table[2, 0]; // 获取第3行第1列的值
三维数组
int[,,] cube = new int[2, 2, 2]; // 三维数组
cube[0, 1, 0] = 20;
3. 交错数组(数组的数组)
交错数组是一个数组,其元素是数组,每个子数组可以有不同的长度。
// 声明与初始化
int[][] jaggedArray = new int[3][]; // 包含3个数组的交错数组
jaggedArray[0] = new int[2]; // 第一个子数组长度为2
jaggedArray[1] = new int[3] {1,2,3}; // 第二个子数组长度为3
// 简化语法
int[][] jagged = {new int[] {1,2},new int[] {3,4,5}
};
// 访问元素
int x = jagged[1][2]; // 获取第二个子数组的第三个元素
4. 数组方法与属性
常用属性
Length
:获取数组总元素数(多维数组返回所有维度的乘积)。Rank
:获取数组的维数(例如,二维数组返回 2)。
常用方法
int[] nums = { 3, 1, 4 };
// 排序
Array.Sort(nums); // 升序排序:[1,3,4]
// 反转
Array.Reverse(nums); // 反转数组:[4,3,1]
// 查找元素
int index = Array.IndexOf(nums, 3); // 返回索引1
// 填充元素
Array.Fill(nums, 0); // 所有元素设为0:[0,0,0]
// 复制数组
int[] copy = new int[3];
Array.Copy(nums, copy, 3); // 复制nums到copy
5. 数组遍历
for 循环
int[] arr = { 1, 2, 3 };
for (int i = 0; i < arr.Length; i++) {Console.WriteLine(arr[i]);
}
foreach 循环
foreach (int num in arr) {Console.WriteLine(num);
}
LINQ 查询
using System.Linq;
var evenNums = arr.Where(n => n % 2 == 0);
6. 数组与泛型集合
数组是固定大小的,而泛型集合(如 List<T>
)可以动态调整大小:
using System.Collections.Generic;
List<int> list = new List<int>();
list.Add(10); // 添加元素
list.AddRange(arr); // 添加数组元素
int count = list.Count; // 获取元素数
7. 参数数组(params)
允许方法接受可变数量的参数:
void PrintNumbers(params int[] numbers) {foreach (int num in numbers) {Console.WriteLine(num);}
}
// 调用
PrintNumbers(1, 2, 3); // 传递多个参数
PrintNumbers(new int[]{4,5}); // 传递数组
8. 数组协变(Covariance)
引用类型数组支持协变,即子类数组可以隐式转换为父类数组:
object[] objArray = new string[5]; // 合法:string是object的子类
objArray[0] = "hello";
objArray[1] = 123; // 运行时异常:不能将int赋值给string[]
总结
类型 | 语法 | 特点 |
---|---|---|
一维数组 | int[] arr; | 元素连续存储,固定长度 |
多维数组 | int[,] matrix; | 矩形结构,每维长度固定 |
交错数组 | int[][] jagged; | 数组的数组,子数组长度可变 |
参数数组 | params int[] numbers | 方法接受可变数量的参数 |
数组是 C# 中基础且重要的数据结构,适合存储和处理固定大小的数据集。对于动态数据,建议使用泛型集合(如 List<T>
)。