Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将项添加到字符串[]数组_C#_Arrays - Fatal编程技术网

C# 将项添加到字符串[]数组

C# 将项添加到字符串[]数组,c#,arrays,C#,Arrays,我有一个类,它的属性类型为string[] 我需要创建另一个数组项,是否必须重置大小并复制以前的所有项?是。数组具有固定大小 根据C#规范: 12.2阵列创建 … 创建阵列实例时,列组 和每个维度的长度是 建立并保持不变 在整个生命周期内 实例。换句话说,事实并非如此 可以更改一个 现有阵列实例,也不是 可以调整其尺寸 您还可以查看Eric Lippert的博客文章,您可以使用它保存数组的内容 e、 g 您需要使用临时变量,因为属性不能用作ref参数。是,如果您希望能够动态附加项,请使用列表 虽

我有一个类,它的属性类型为string[]


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

是。数组具有固定大小

根据C#规范:

12.2阵列创建

创建阵列实例时,列组 和每个维度的长度是 建立并保持不变 在整个生命周期内 实例。换句话说,事实并非如此 可以更改一个 现有阵列实例,也不是 可以调整其尺寸

您还可以查看Eric Lippert的博客文章,您可以使用它保存数组的内容

e、 g


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

是,如果您希望能够动态附加项,请使用
列表


虽然不将列表作为属性公开是最佳做法,但请改用
IList
IEnumerable

如果是您的类,您可能应该将属性更改为使用
IList
ICollection
IEnumerable
,具体取决于您预期如何使用此属性。然后,无论您选择从函数返回哪一个,请尝试在类型本身中使用
列表。

我更喜欢将字符串[]复制到列表中,执行所有操作,然后.ToArray()生成结果字符串[]。

您控制该类吗?如果是,请考虑使用<代码>列表>代码>内部。

(当您在使用它时,请考虑在公共API中使用<代码> IIST < /Cord>,而不是<代码> String []/P>> P> >如果可能的话,我将使用列表。管理起来容易多了。显然,这取决于你的班级和你是否能够毫无问题地抓住这个机会

List<string> myList = new List<string>();
            myList.Add("item");
            myList.Remove("item");
List myList=new List();
myList.添加(“项目”);
myList.删除(“项目”);
如果必须使用数组,请使用


使用
列表
更容易,但如果您不控制该属性,则这不是一个选项。请注意,这在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
为空,创建长度为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;
}
publicstaticvoidappend(参考T[]arr,T项){
Resize(ref-arr,arr==null?1:(arr.Length+1));
arr[arr.Length-1]=项目;
}

这在内部基本上是重新分配+复制,所以这仍然是一个要求;数组具有固定大小。但是问题是“我必须”而答案是否定的,因为此功能是内置的。这就是为什么有这么多集合类。您可能需要添加更多详细信息。。。这是您自己的
string[]
类型的代码,还是您无法编辑的某些API的一部分?您使用的是哪个版本的C#?(这可能会使这里列出的大多数答案无效!)哇,这太苛刻了,没有理由解释为什么这是一个如此可怕的做法?我也想知道。也许开始一个新的问题来描述你的答案,并问为什么它不好?用一个向上的投票来修正。如果属性是一个字符串数组,而他不拥有也无法控制,那么这是一个不错的解决方案。
obj.SomeProp = obj.SomeProp.Append(someValue);
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;
}