C#向具有现有大小的数组添加和删除元素

时间:2018-05-18 15:07:36

标签: c# arrays

我刚才有一个问题。我注意到,与C ++不同,C#在数组方面有点复杂。我在数组中一直在寻找的一个特性或技术是:我想以更有效和更简单的方式添加元素或从中删除元素。

比方说,我有一个名为' food'。

的数组
string[] food = {'Bacon', 'Cheese', 'Patty', 'Crabs'}

然后我决定添加更多食物。 C#的问题我可以看到,除非你使用ArrayList,否则这是不可能做到的。数组本身怎么样?我希望将数组用作我添加内容的某种库存。

非常感谢!

4 个答案:

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

我希望这会有所帮助。