HOWTO · Csharp
在 C# 中向数组中添加字符串
没有内置方法可以将新元素动态添加到 C# 中完全填充的数组中。
本页内容
C# 中的数组长度是固定的,因此您无法就地将元素追加到同一个数组。若要添加一个值,请创建更大的数组,或将值复制到可调整大小的集合中。当您预期会重复添加值时,请使用 List<T>;当结果必须保持为数组时,若要直接一次性扩大,请使用 Array.Resize。示例使用字符串,但当添加值的类型相符时,任一种方法都适用于其他元素类型。
通过将数组转换为 List<T> 来添加元素
将现有数组转换为 List<T>,然后调用 List<T>.Add 将新值追加到该列表。在 C# 中,List<T>.Add 是用于添加项的列表方法;无法在数组本身上调用它。只有当后续代码需要数组时,才将列表转换回来。List<T> 会在增长时管理其容量,因此在添加多个值时是较简单的选择。转换直接使用 List<T> 构造函数;不需要 LINQ。
这个完整示例说明了如何添加一个字符串并保留数组结果。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
string[] items = { "One", "Two", "Three" };
string newItem = "New Element";
var list = new List<string>(items);
// List<T>.Add appends the new value to the list.
list.Add(newItem);
items = list.ToArray();
foreach (string item in items)
{
Console.WriteLine(item);
}
}
}
One
Two
Three
New Element
new List<string>(items) 将数组的值复制到列表中。List<T>.Add 将 newItem 追加到该列表,而 ToArray() 则创建供程序其余部分使用的数组。如果后续代码可以使用列表,请保留列表并跳过最后的转换。
数组到列表的转换会复制现有元素,而列表可以随着值被追加而增长。转换回来会创建另一个数组,因此当下一个操作接受 List<string> 时,请省略该步骤。对于泛型数组,请使用相符的列表类型,例如 int[] 使用 List<int>,并添加相同类型的值。
使用 Array.Resize 向数组添加元素
若需要数组且只需添加一次,请以引用方式传入数组及其新长度来调用 Array.Resize,然后将值赋到最后一个索引。调整大小会创建一个替代数组,并将现有值复制到其中;ref 参数会更新变量,使其引用该替代数组。调整大小后,新的位置可在 Length - 1 处使用。
这个完整示例显示了调整大小并赋值的顺序。
using System;
class Program
{
static void Main()
{
string[] items = { "One", "Two", "Three" };
string newItem = "New Element";
Array.Resize(ref items, items.Length + 1);
items[items.Length - 1] = newItem;
foreach (string item in items)
{
Console.WriteLine(item);
}
}
}
One
Two
Three
New Element
调用后,items 引用较大的数组,因此在 items.Length - 1 处赋值会填入其新添加的位置。这对于一次性的更改来说很直接。重复地每次调整大小一个元素,会在每次调用时复制现有值,因此重复添加时请改用 List<T>。
Array.Resize 以 ref 方式接收数组变量,因此更新后的引用在调用后仍可通过 items 使用。将请求的长度增加所需额外位置的数量,然后将每个新值赋到其对应的索引。对于单个追加值,最后的索引是 Length - 1;对于多次添加,请先填入每个新索引,再在其他地方使用调整大小后的数组。数组的元素类型仍决定您可以赋哪些值。