C#数组学习
《C#数组学习》
一、引言
在C#编程中,数组是一种基础且重要的数据结构,它允许开发者以连续的内存空间存储相同类型的多个元素。无论是处理简单的数据集合,还是构建复杂的算法逻辑,数组都扮演着不可或缺的角色。本文将系统介绍C#数组的定义、声明、初始化、操作方法以及高级应用场景,帮助读者全面掌握数组的使用技巧。
二、数组基础
1. 数组的定义与声明
数组是引用类型,其声明需要指定元素类型和维度。C#支持一维数组、多维数组(矩形数组)和交错数组(锯齿数组)。
(1)一维数组声明
// 声明一个包含5个整数的数组
int[] numbers = new int[5];
// 声明并初始化
string[] names = new string[] { "Alice", "Bob", "Charlie" };
// 简写形式(编译器可推断长度)
double[] values = { 1.1, 2.2, 3.3 };
(2)多维数组声明
// 二维数组(3行4列)
int[,] matrix = new int[3, 4];
// 三维数组
float[,,] cube = new float[2, 3, 4];
(3)交错数组声明
// 交错数组(每个子数组长度可不同)
int[][] jaggedArray = new int[3][];
jaggedArray[0] = new int[2] { 1, 2 };
jaggedArray[1] = new int[3] { 3, 4, 5 };
2. 数组初始化
数组初始化分为显式初始化和隐式初始化:
// 显式初始化(指定索引赋值)
int[] explicitInit = new int[5];
explicitInit[0] = 10;
explicitInit[1] = 20;
// 隐式初始化(使用初始化器)
int[] implicitInit = { 100, 200, 300 };
对于多维数组,初始化方式类似:
int[,] multiInit = {
{ 1, 2, 3 },
{ 4, 5, 6 }
};
三、数组操作
1. 访问元素
通过索引访问数组元素(索引从0开始):
int[] arr = { 10, 20, 30 };
Console.WriteLine(arr[1]); // 输出20
对于多维数组,使用逗号分隔的索引:
int[,] matrix = { { 1, 2 }, { 3, 4 } };
Console.WriteLine(matrix[1, 0]); // 输出3
2. 遍历数组
(1)使用for循环
int[] numbers = { 1, 2, 3, 4, 5 };
for (int i = 0; i
(2)使用foreach循环
foreach (int num in numbers) {
Console.WriteLine(num);
}
(3)多维数组遍历
int[,] matrix = { { 1, 2 }, { 3, 4 } };
for (int i = 0; i
3. 数组属性与方法
(1)Length属性:获取数组总元素数
int[] arr = new int[10];
Console.WriteLine(arr.Length); // 输出10
(2)Rank属性:获取数组维度
int[,] multiArr = new int[2, 3];
Console.WriteLine(multiArr.Rank); // 输出2
(3)GetLength方法:获取指定维度的长度
int[,,] cube = new int[2, 3, 4];
Console.WriteLine(cube.GetLength(1)); // 输出3
(4)Copy方法:复制数组
int[] source = { 1, 2, 3 };
int[] destination = new int[3];
Array.Copy(source, destination, source.Length);
// 或使用Clone方法
int[] cloned = (int[])source.Clone();
(5)Sort方法:排序数组
int[] unsorted = { 5, 2, 8, 1 };
Array.Sort(unsorted);
// 自定义排序(使用IComparer)
string[] names = { "John", "Alice", "Bob" };
Array.Sort(names, StringComparer.OrdinalIgnoreCase);
(6)Reverse方法:反转数组
int[] arr = { 1, 2, 3 };
Array.Reverse(arr); // 变为{3,2,1}
四、数组与集合的关系
1. 数组与List
(1)数组转List
int[] arr = { 1, 2, 3 };
List list = new List(arr);
(2)List转数组
List names = new List { "A", "B" };
string[] namesArr = names.ToArray();
2. 性能比较
数组在访问速度上优于List,因为List内部使用数组实现且存在扩容开销。但List提供了动态扩容、插入删除等便捷操作。
五、数组高级应用
1. 参数传递(引用类型特性)
void ModifyArray(int[] arr) {
arr[0] = 100;
}
int[] original = { 1, 2, 3 };
ModifyArray(original);
Console.WriteLine(original[0]); // 输出100
2. 作为方法返回值
int[] GenerateNumbers(int count) {
int[] result = new int[count];
for (int i = 0; i
3. 多维数组的实际应用
(1)矩阵运算
int[,] AddMatrices(int[,] a, int[,] b) {
int rows = a.GetLength(0);
int cols = a.GetLength(1);
int[,] result = new int[rows, cols];
for (int i = 0; i
(2)图像处理(像素数组)
byte[,,] imageData = new byte[height, width, 3]; // RGB通道
4. 交错数组的典型场景
处理不规则数据结构,如学生各科成绩:
int[][] studentGrades = new int[3][];
studentGrades[0] = new int[] { 90, 85 }; // 学生1的两科成绩
studentGrades[1] = new int[] { 78, 92, 88 }; // 学生2的三科成绩
六、常见问题与解决方案
1. 数组越界异常
try {
int[] arr = { 1, 2 };
Console.WriteLine(arr[2]); // 抛出IndexOutOfRangeException
} catch (IndexOutOfRangeException ex) {
Console.WriteLine("索引超出范围:" + ex.Message);
}
2. 数组与字符串的转换
(1)字符串转数组
string input = "1,2,3";
string[] stringArr = input.Split(',');
int[] intArr = Array.ConvertAll(stringArr, int.Parse);
(2)数组转字符串
int[] numbers = { 1, 2, 3 };
string joined = string.Join(",", numbers);
3. 动态数组需求
当需要动态增减元素时,优先使用List
List dynamicList = new List();
dynamicList.Add(10);
dynamicList.RemoveAt(0);
七、最佳实践
1. 明确数组用途:固定大小数据用数组,动态数据用集合
2. 初始化时指定容量:避免频繁扩容
// 错误示例(多次扩容)
List badList = new List();
for (int i = 0; i goodList = new List(10000);
for (int i = 0; i
3. 使用foreach替代for(仅需遍历时)
4. 多维数组考虑使用Jagged Array优化性能(当各维度长度不均时)
八、总结
C#数组作为基础数据结构,具有高效的访问性能和丰富的操作方法。通过掌握一维/多维/交错数组的声明与初始化,熟练运用数组属性与方法,开发者可以高效处理各种数据集合场景。在实际开发中,需根据业务需求选择数组或集合类型,并注意边界检查、性能优化等关键点。
关键词:C#数组、一维数组、多维数组、交错数组、数组初始化、数组操作、Array类方法、数组与集合、性能优化
简介:本文全面介绍C#数组的核心概念与使用技巧,涵盖数组声明、初始化、遍历、常用方法及高级应用场景,对比数组与集合的差异,提供实际开发中的最佳实践和问题解决方案。