在 C# 中,数组的长度是固定的,一旦数组被创建,其长度就不能直接改变。然而,可以通过创建一个新数组并将原数组的内容复制到新数组中,从而间接地实现“动态改变数组的长度”。对于更高效和动态的操作,建议使用动态集合如 List
以下是几种实现方式:
方法 1:创建新数组并复制内容
如果需要动态扩展或缩小数组,可以手动创建一个新的数组并复制原始数组的内容。
示例代码
using System;
class Program
{
static void Main()
{
// 原数组
int[] originalArray = { 1, 2, 3 };
Console.WriteLine("原数组长度: " + originalArray.Length);
// 创建一个新数组,长度为原数组 + 2
int[] newArray = new int[originalArray.Length + 2];
// 复制原数组内容到新数组
Array.Copy(originalArray, newArray, originalArray.Length);
// 添加新元素
newArray[3] = 4;
newArray[4] = 5;
Console.WriteLine("新数组长度: " + newArray.Length);
Console.WriteLine("新数组内容: " + string.Join(", ", newArray));
}
}
输出
原数组长度: 3
新数组长度: 5
新数组内容: 1, 2, 3, 4, 5
方法 2:使用List动态管理数组
List
示例代码
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 使用 List 替代数组
List dynamicList = new List { 1, 2, 3 };
Console.WriteLine("原 List 长度: " + dynamicList.Count);
// 添加新元素
dynamicList.Add(4);
dynamicList.Add(5);
// 移除一个元素
dynamicList.Remove(2);
Console.WriteLine("新 List 长度: " + dynamicList.Count);
Console.WriteLine("新 List 内容: " + string.Join(", ", dynamicList));
}
}
输出
原 List 长度: 3
新 List 长度: 4
新 List 内容: 1, 3, 4, 5
方法 3:扩展或缩减数组的范围(通过数组切片)
在 C# 8.0 及更高版本中,可以使用 System.Span
示例代码(数组切片)
using System;
class Program
{
static void Main()
{
int[] array = { 1, 2, 3, 4, 5 };
// 创建一个数组切片
Span slice = array.AsSpan(1, 3); // 包括索引 1 到 3 的元素
Console.WriteLine("数组切片: " + string.Join(", ", slice.ToArray()));
// 修改切片中的元素
slice[0] = 10;
Console.WriteLine("原数组修改后: " + string.Join(", ", array));
}
}
输出
数组切片: 2, 3, 4
原数组修改后: 1, 10, 3, 4, 5
方法 4:使用Array.Resize方法
C# 提供了一个方便的方法 Array.Resize,它可以动态调整数组大小(实际上是创建了一个新数组并复制内容)。
示例代码
using System;
class Program
{
static void Main()
{
int[] array = { 1, 2, 3 };
Console.WriteLine("原数组长度: " + array.Length);
// 调整数组大小
Array.Resize(ref array, 5);
array[3] = 4;
array[4] = 5;
Console.WriteLine("调整后数组长度: " + array.Length);
Console.WriteLine("调整后数组内容: " + string.Join(", ", array));
}
}
输出
原数组长度: 3
调整后数组长度: 5
调整后数组内容: 1, 2, 3, 4, 5
总结
方法 | 优点 | 缺点 |
手动复制内容到新数组 | 灵活,可以完全控制新数组的大小 | 手动操作麻烦,效率较低 |
使用 List | 动态调整,功能丰富,简单易用 | 需要额外的内存开销(不是原生数组) |
使用数组切片 | 内存效率高,不需要复制数组 | 只提供视图,不改变实际数组的大小 |
使用 Array.Resize | 简单快捷,自动完成数组调整 | 底层仍需创建新数组,效率不如 List |
在需要频繁动态调整数组长度的场景下,建议优先使用 List