我的类有一个string []类型的属性。
我需要创建另一个数组项,是否必须重置大小并复制以前的所有项目?
答案 0 :(得分:14)
您可以使用Array.Resize
来保留数组的内容。
e.g。
var array = myClass.SomeArrayProperty;
Array.Resize(ref array, newSize);
myClass.SomeArrayProperty = array;
您需要使用临时变量,因为属性不能用作ref
参数。
答案 1 :(得分:6)
如果它是您的类,您应该更改属性以使用IList<string>
,ICollection<string>
或IEnumerable<string>
,具体取决于您预期此属性的方式使用。然后,无论您选择从函数返回哪一个,请尝试在类型本身中使用List<string>
。
答案 2 :(得分:5)
是的,如果您希望能够动态追加项目,请使用List
。
虽然最好不要将List公开为属性,但请改用IList<string>
或IEnumerable<String>
。
答案 3 :(得分:3)
如果可能,我会使用一个列表。管理起来要容易得多。显然,这取决于它是否是你的班级,你能够毫无问题地胜任这一点。
List<string> myList = new List<string>();
myList.Add("item");
myList.Remove("item");
如果必须使用数组,请使用
答案 4 :(得分:1)
是。数组具有固定的大小。
来自C#规范:
12.2阵列创建
...
创建数组实例时,排名 并且每个维度的长度都是 建立然后保持不变 在整个一生中 实例即可。换句话说,事实并非如此 可以改变一个等级 现有的数组实例,也不是 可以调整其尺寸。
您还可以查看Eric Lippert Arrays considered somewhat harmful
的博客文章答案 5 :(得分:1)
我更希望将字符串[]复制到List&lt; string&gt;,执行所有操作,然后.ToArray()生成结果字符串[]。
答案 6 :(得分:0)
你控制班级吗?如果是这样,请考虑在内部使用List<string>
。
(在您使用时,请考虑在公共API中使用IList<string>
而不是string[]
。)
答案 7 :(得分:0)
使用List<T>
更容易,但如果您不控制该属性,则这不是一个选项。请注意,这在soap生成的代理中很常见,但是如果您更喜欢列表到数组,IIRC可以使用命令行开关。
请注意,如果您经常这样做,扩展方法可能会有所帮助:
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;
}