一、数组的定义
在C#中,数组是一种用于存储固定大小的相同类型元素的集合。数组中的每个元素可以通过索引来访问,索引是从0开始的。
1. 一维数组
一维数组是最简单的数组形式,它存储了一行数据。
csharp
// 声明并初始化一个包含5个整数的数组
int[] numbers = new int[5];
// 或者在声明时直接初始化数组元素
int[] numbers2 = { 1, 2, 3, 4, 5 };
// 访问数组元素
int secondNumber = numbers2[1]; // 访问索引为1的元素,即2
2. 多维数组
多维数组用于存储多个维度的数据,如二维数组(矩阵)、三维数组等。
csharp
// 声明并初始化一个2x3的二维数组
int[,] matrix = new int[2, 3];
// 或者在声明时直接初始化二维数组元素
int[,] matrix2 = {
{1, 2, 3},
{4, 5, 6}
};
// 访问二维数组元素
int element = matrix2[0, 1]; // 访问第一行第二列的元素,即2
二、数组的常用方法
1. 搜索数组
使用Array.IndexOf
方法来搜索数组中的元素。
csharp
int[] numbers = { 1, 2, 3, 4, 5 };
int index = Array.IndexOf(numbers, 3); // 返回3的索引,即2
2. 排序数组
使用Array.Sort
方法对数组进行排序。
csharp
int[] numbers = { 5, 2, 3, 4, 1 };
Array.Sort(numbers);
3. 复制数组
使用Array.Copy
或ToArray
(如果是集合转数组)进行数组的复制。
csharp
int[] original = { 1, 2, 3 };
int[] copy = new int[original.Length];
Array.Copy(original, copy, original.Length);
// 或者对于集合
List<int> list = new List<int> { 1, 2, 3 };
int[] listToArray = list.ToArray();
4. 数组清空
数组的大小是固定的,所以不能直接"清空"数组。但可以将所有元素设置为默认值(如0或null)。
csharp
int[] numbers = { 1, 2, 3 };
Array.Clear(numbers, 0, numbers.Length); // 将所有元素设置为0
5. 数组拼接
使用Array.Copy
或LINQ的Concat
(需要转换为IEnumerable<T>
)进行拼接。
csharp
int[] first = { 1, 2, 3 };
int[] second = { 4, 5, 6 };
int[] result = new int[first.Length + second.Length];
Array.Copy(first, 0, result, 0, first.Length);
Array.Copy(second, 0, result, first.Length, second.Length);
// 或使用LINQ
var concatenated = first.Concat(second).ToArray();
6. 数组截取
使用Array.Copy
进行截取,或者LINQ的Take
和Skip
方法。
csharp
int[] numbers = { 1, 2, 3, 4, 5 };
int[] subset = new int[3];
Array.Copy(numbers, 1, subset, 0, 3); // 截取索引1到3的元素
// 或使用LINQ
var subsetLinq = numbers.Skip(1).Take(3).ToArray();
7. 数组反转
使用Array.Reverse
方法进行反转。
csharp
int[] numbers = { 1, 2, 3, 4, 5 };
Array.Reverse(numbers);
8. 数组填充
使用Array.Fill
方法进行填充。
csharp
int[] numbers = new int[5];
Array.Fill(numbers, 0); // 填充所有元素为0
9. 数组切片(在C#中不是直接支持的,但可以用上述方法模拟)
C#不直接支持切片操作,但可以使用Array.Copy
或LINQ来实现类似的功能。
10. 数组转换
将数组转换为不同类型的集合或数组,可以使用LINQ的Select
等方法。
csharp
int[] numbers = { 1, 2, 3 };
var doubled = numbers.Select(n => n * 2).ToArray(); // 转换为新的数组,每个元素都乘以2
11. 数组批量赋相同值
使用LINQ的Repeat
和ToArray
方法来实现数组批量赋相同值。
csharp
int[] filledArray = Enumerable.Repeat(5, 10).ToArray(); // 创建一个长度为10的数组,所有元素都是5
12. 数组批量操作(如批量修改)
虽然C#标准库中没有直接的批量修改数组元素的API,但可以通过循环或LINQ的Select
配合ToArray
来实现。
csharp
int[] numbers = { 1, 2, 3, 4, 5 };
int[] incremented = numbers.Select(n => n + 1).ToArray(); // 每个元素加1
13. 数组元素类型转换
当需要将数组中的元素转换为另一种类型时,可以使用Array.ConvertAll
(对于一维数组)或自定义转换逻辑。
csharp
double[] doubles = { 1.0, 2.0, 3.0 };
int[] ints = Array.ConvertAll(doubles, Convert.ToInt32); // 注意:这可能会导致精度丢失
14. 数组与集合的互转
数组可以很容易地转换为集合(如List<T>
),反之亦然。
csharp
int[] array = { 1, 2, 3 };
List<int> list = new List<int>(array); // 数组转集合
List<int> anotherList = new List<int> { 4, 5, 6 };
int[] anotherArray = anotherList.ToArray(); // 集合转数组
15. 数组排序的自定义比较器
Array.Sort
和List<T>.Sort
方法都允许使用自定义比较器来对数组或集合进行排序。
csharp
int[] numbers = { 5, 2, 9, 1, 5 };
Array.Sort(numbers, (a, b) => b.CompareTo(a)); // 降序排序
注意事项
- 当操作大型数组时,需要注意性能和内存使用。
- 数组的大小在声明时确定,且不可更改。如果需要动态大小的集合,请考虑使用
List<T>
。 - 多维数组的操作通常比一维数组更复杂,因为它们需要额外的索引来访问元素。