我刚才有一个问题。我注意到,与C ++不同,C#在数组方面有点复杂。我在数组中一直在寻找的一个特性或技术是:我想以更有效和更简单的方式添加元素或从中删除元素。
比方说,我有一个名为' food'。
的数组string[] food = {'Bacon', 'Cheese', 'Patty', 'Crabs'}
然后我决定添加更多食物。 C#的问题我可以看到,除非你使用ArrayList,否则这是不可能做到的。数组本身怎么样?我希望将数组用作我添加内容的某种库存。
非常感谢!
答案 0 :(得分:2)
您无法在C#中使用数组执行此操作而无需分配新数组。因为数组的大小是固定的。
如果您希望能够在容器中添加/删除元素,可以使用List<T>
。另外,您可以使用ArrayList,但不推荐这样做,因为在大多数情况下List<T>
具有性能优势。
在内部都使用数组作为数据的默认容器。他们还会根据您收集或取出的数据来调整容器大小。
在您的示例中,您将使用类似
的列表 List<string> food = new List<string> { "Bacon", "Cheese", "Patty", "Crabs" };
food.Add("Milk"); //Will add Milk to the list
food.Remove("Bacon"); //Will remove "Bacon"
MSDN上的列表:Docs
答案 1 :(得分:0)
要真正回答这个问题,您只需要调整数组大小。 Array.Resize(ref array,); 是数组的新长度
答案 2 :(得分:0)
要真正添加元素到现有数组而不调整大小,您就无法做到。或者,你呢?是的,但有一些诡计,在某些时候你可能会说不值得。
考虑分配一个你预期可以的大小的数组。你显然必须好好估计以避免大量未使用的空间。数组中的空插槽将标记为sentinel value;对于string
,显而易见的候选人是null
。你知道&#34; true&#34;通过跟踪标记的第一个索引来跟踪数组的大小。这表明ArrayWrapper
类将封装数组和&#34;真实大小&#34;。
该包装器可以添加Add()
和AddRange()
,用真实的值替换sentinel值而不分配。
所有这一切,在某些方面的缺点是你必须分配一个新的数组。除非您有非常具体的要求允许您减少分配,否则使用包装器手动执行此操作是没有意义的。
因此,对于最常见的情况,请坚持使用List<>
,这样做适合您。使用列表,您可以通过调用带有初始容量参数的构造函数来构造它。添加将使用基础数组,而不会重新分配,直到达到限制。
以List<>
使用分配模型的包装器的方式,原始作者决定在大多数情况下最小化分配。除非您真正利用您的域,否则这可能比您编写的任何内容都要好。
答案 3 :(得分:0)
理想情况下,如果您要使用可变大小的字符串数组,则List会更好。您只需拨打list.Add("")
,list.Remove("")
和其他等效方法即可。
但是如果你想继续使用字符串数组,你可以创建一个接受数组的函数或类,创建一个更大或更小的新数组,用你原来的值重新填充该数组。数组,并返回新数组。
public string[] AddFood(string[] input, string var)
{
string[] result = new string[input.Length + 1];
for (int i = 0; i < input.Length; i++)
{
result[i] = input[i];
}
result[result.Length - 1] = var;
return result;
}
public string[] RemoveFood(string[] input, int index)
{
string[] result = new string[input.Length - 1];
for (int i = 0; i < input.Length; i++)
{
if (i < index) {
result[i] = input[i];
}
else
{
result[i] = input[i + 1];
}
}
return result;
}
同样,我强烈建议改为使用List方法。这些列表的唯一缺点是它将它们追加到最后,而不是确定你想要放置所述项目的位置。
List<string> myFoods = new List<String>(food);
myFoods.Add("Apple");
myFoods.Remove("Bacon");
myFoods.AddRange(new string[] { "Peach", "Pineapple" });
myFoods.RemoveAt(2);
Console.WriteLine(myFoods[0]);
如果您希望列表更像数组,那么还有ArrayList,但它是older code and unfavoured。
ArrayList myFoods = new ArrayList(food);
myFoods.Add("Apple");
myFoods.Remove("Bacon");
myFoods.AddRange(new string[] { "Peach", "Pineapple" });
myFoods.RemoveAt(2);
Console.WriteLine(myFoods[0]);
我希望这会有所帮助。