将项添加到string []数组

时间:2009-10-05 15:06:48

标签: c# arrays

我的类有一个string []类型的属性。

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

8 个答案:

答案 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");

如果必须使用数组,请使用

Array.Resize

答案 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;
}