将一个项目添加到string[]数组中

3

我有一个类,其中的一个属性是字符串数组类型。

我需要创建另一个数组项,我是否需要重置大小并复制所有先前的项目?


6
这就是为什么有那么多的集合类。 - user1228
你可能需要添加更多细节...这个 string[] 类型的代码是你自己的还是属于某个你无法编辑的 API?你正在使用哪个版本的 C#?(这可能会使此处列出的大多数答案失效!) - John Rasch
8个回答

14
你可以使用 Array.Resize,它能保留数组内容。
例如:
var array = myClass.SomeArrayProperty;
Array.Resize(ref array, newSize);
myClass.SomeArrayProperty = array;

你需要使用一个临时变量,因为属性不能作为ref参数使用。


1
内部基本上执行重新分配和复制,因此仍然需要。 - Reed Copsey
2
当然可以;数组有固定的大小。然而问题是“是否必须”,答案是否定的,因为这个功能已经内置了。 - Greg Beech

6
如果这是你自己的类,你应该将属性更改为使用 IList<string>ICollection<string>IEnumerable<string> 中的一个,具体取决于你预计此属性将如何使用。然后,无论你选择从函数中返回哪个类型,都尝试在类型本身中使用 List<string>

5

如果您想能够动态添加项目,请使用 List

虽然最好的做法是不要将 List 公开为属性,因此请改用 IList<string>IEnumerable<String>


3

如果可能的话,我会使用列表。这样更容易管理。当然,这取决于是否是你的类,而且你可以在没有任何问题的情况下改变它。

List<string> myList = new List<string>();
            myList.Add("item");
            myList.Remove("item");

如果你必须使用数组,那么请使用 Array.Resize

1

是的。数组具有固定大小。

C#规范中提到:

12.2 数组创建
...
当创建数组实例时,确定每个维度的秩和长度,然后在整个实例的生命周期内保持不变。换句话说,无法更改现有数组实例的秩,也无法调整其维度大小。

您还可以查看Eric Lippert的博客文章Arrays considered somewhat harmful


1

我更喜欢将 string[] 复制到 List<string> 中,执行所有操作,然后使用 .ToArray() 生成结果的 string[]。


3
哇,那太严厉了,为什么这种可怕的做法会如此恶劣却没有任何理由? - csharptest.net
1
我也很感兴趣。也许可以提出一个新问题,描述你的答案并询问为什么不好呢? - Daniel Schaffer
修复并点赞。如果该属性是一个字符串数组,而他又不拥有且无法控制它,那么这是一个不错的解决方案。 - Mike Hofer

0

使用 List<T> 更容易操作,但如果您无法控制属性,则无法选择此选项。请注意,这在 soap 生成的代理中很常见,但是如果您更喜欢列表而不是数组,则可以使用命令行开关。

请注意,如果您经常这样做,扩展方法可能会有所帮助:

public static T[] Append<T>(this T[] arr, T item) {
    Array.Resize(ref arr, arr == null ? 1 : (arr.Length + 1));
    arr[arr.Length-1] = item;
    return arr;
}

然后您可以将其用于您的属性:

obj.SomeProp = obj.SomeProp.Append(someValue);

(请注意,即使obj.SomeProp为空,此方法也能正常运行,并创建长度为1的数组)

如果它是一个字段/变量,那么一个简单的ref参数也可能会奏效:

public static void Append<T>(ref T[] arr, T item) {
    Array.Resize(ref arr, arr == null ? 1 : (arr.Length + 1));
    arr[arr.Length-1] = item;
}

0

你控制这个类吗?如果是的话,考虑在内部使用 List<string>

(而且,在此过程中,考虑在你的公共 API 中使用 IList<string> 而不是 string[]。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接