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