我有一个类,其中的一个属性是字符串数组类型。
我需要创建另一个数组项,我是否需要重置大小并复制所有先前的项目?
Array.Resize
,它能保留数组内容。var array = myClass.SomeArrayProperty;
Array.Resize(ref array, newSize);
myClass.SomeArrayProperty = array;
你需要使用一个临时变量,因为属性不能作为ref
参数使用。
IList<string>
、ICollection<string>
或 IEnumerable<string>
中的一个,具体取决于你预计此属性将如何使用。然后,无论你选择从函数中返回哪个类型,都尝试在类型本身中使用 List<string>
。如果您想能够动态添加项目,请使用 List
。
虽然最好的做法是不要将 List 公开为属性,因此请改用 IList<string>
或 IEnumerable<String>
。
如果可能的话,我会使用列表。这样更容易管理。当然,这取决于是否是你的类,而且你可以在没有任何问题的情况下改变它。
List<string> myList = new List<string>();
myList.Add("item");
myList.Remove("item");
是的。数组具有固定大小。
C#规范中提到:
12.2 数组创建
...
当创建数组实例时,确定每个维度的秩和长度,然后在整个实例的生命周期内保持不变。换句话说,无法更改现有数组实例的秩,也无法调整其维度大小。
您还可以查看Eric Lippert的博客文章Arrays considered somewhat harmful。
我更喜欢将 string[] 复制到 List<string> 中,执行所有操作,然后使用 .ToArray() 生成结果的 string[]。
使用 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;
}
你控制这个类吗?如果是的话,考虑在内部使用 List<string>
。
(而且,在此过程中,考虑在你的公共 API 中使用 IList<string>
而不是 string[]
。)
string[]
类型的代码是你自己的还是属于某个你无法编辑的 API?你正在使用哪个版本的 C#?(这可能会使此处列出的大多数答案失效!) - John Rasch