跳转到内容

C Sharp 一维数组

来自代码酷

C#一维数组[编辑 | 编辑源代码]

介绍[编辑 | 编辑源代码]

一维数组是C#中最基础的数据结构之一,用于存储相同类型的元素集合。数组中的每个元素通过从0开始的索引访问,提供高效的内存管理和快速的数据访问能力。一维数组在内存中是连续存储的,这使得它们在处理大量同类型数据时非常高效。

声明与初始化[编辑 | 编辑源代码]

C#中一维数组可以通过多种方式声明和初始化:

声明语法[编辑 | 编辑源代码]

// 声明但不初始化
数据类型[] 数组名;

// 示例
int[] numbers;

初始化方式[编辑 | 编辑源代码]

// 方式1:声明时初始化
int[] numbers = new int[5]; // 创建长度为5的数组,默认值为0

// 方式2:声明并赋初始值
int[] primes = new int[] { 2, 3, 5, 7, 11 };

// 方式3:简化语法
string[] weekDays = { "Mon", "Tue", "Wed", "Thu", "Fri" };

访问数组元素[编辑 | 编辑源代码]

数组元素通过索引访问,索引从0开始:

int[] scores = { 85, 90, 78, 92, 88 };

// 访问第一个元素
int firstScore = scores[0]; // 85

// 修改第三个元素
scores[2] = 80; // 数组变为 { 85, 90, 80, 92, 88 }

数组属性与方法[编辑 | 编辑源代码]

C#数组提供了一些有用的属性和方法:

Length属性[编辑 | 编辑源代码]

获取数组的长度(元素数量):

int[] numbers = { 10, 20, 30, 40, 50 };
int length = numbers.Length; // 5

常用方法[编辑 | 编辑源代码]

int[] arr = { 5, 3, 8, 1, 9 };

// 排序
Array.Sort(arr); // 结果:1, 3, 5, 8, 9

// 反转
Array.Reverse(arr); // 结果:9, 8, 5, 3, 1

// 查找索引
int index = Array.IndexOf(arr, 5); // 2

遍历数组[编辑 | 编辑源代码]

有多种方式可以遍历数组:

for循环[编辑 | 编辑源代码]

for (int i = 0; i < numbers.Length; i++)
{
    Console.WriteLine(numbers[i]);
}

foreach循环[编辑 | 编辑源代码]

foreach (int num in numbers)
{
    Console.WriteLine(num);
}

内存表示[编辑 | 编辑源代码]

一维数组在内存中是连续存储的:

graph LR A[索引0] --> B[索引1] --> C[索引2] --> D[...] --> E[索引n-1]

数学上,数组元素的内存地址可以表示为: 解析失败 (语法错误): {\displaystyle 地址 = 基地址 + (索引 \times 元素大小) }

实际应用案例[编辑 | 编辑源代码]

案例1:成绩统计[编辑 | 编辑源代码]

// 计算学生平均分
double[] grades = { 85.5, 90.0, 78.5, 92.5, 88.0 };
double sum = 0;

foreach (double grade in grades)
{
    sum += grade;
}

double average = sum / grades.Length;
Console.WriteLine($"平均分: {average:F2}"); // 输出: 平均分: 86.90

案例2:温度转换[编辑 | 编辑源代码]

// 将摄氏温度数组转换为华氏温度
double[] celsiusTemps = { 0, 10, 20, 30, 40 };
double[] fahrenheitTemps = new double[celsiusTemps.Length];

for (int i = 0; i < celsiusTemps.Length; i++)
{
    fahrenheitTemps[i] = celsiusTemps[i] * 9/5 + 32;
}

// 输出转换结果
for (int i = 0; i < fahrenheitTemps.Length; i++)
{
    Console.WriteLine($"{celsiusTemps[i]}°C = {fahrenheitTemps[i]}°F");
}

最佳实践[编辑 | 编辑源代码]

1. 总是检查数组边界,避免IndexOutOfRangeException 2. 考虑使用foreach循环来遍历数组,除非需要索引 3. 对于固定大小的集合,数组比集合更高效 4. 使用Array.Resize方法可以调整数组大小(但会创建新数组)

常见错误[编辑 | 编辑源代码]

错误1:越界访问[编辑 | 编辑源代码]

int[] arr = new int[3];
arr[3] = 10; // 抛出IndexOutOfRangeException

错误2:错误初始化[编辑 | 编辑源代码]

int[] arr;
arr = {1, 2, 3}; // 编译错误,必须使用new关键字

性能考虑[编辑 | 编辑源代码]

  • 访问时间:O(1) - 恒定时间访问
  • 搜索时间:O(n) - 线性搜索
  • 内存:连续分配,无额外开销

进阶主题[编辑 | 编辑源代码]

  • 数组协变(Array Covariance)
  • 缓冲区操作(Buffer.BlockCopy)
  • 固定大小缓冲区(在unsafe上下文中)

总结[编辑 | 编辑源代码]

一维数组是C#中处理同类型元素集合的基本工具。它们提供了高效的存储和访问机制,适合处理固定大小的数据集合。理解数组的基本操作和特性是掌握更复杂数据结构的重要基础。