如何在C#中向数组末尾添加元素?

21

如何在 Windows 表单上使用文本框和按钮添加一个新的 item 到引用类的 ArrayList 的末尾?

private product[] value = new product[4];

value[1] = new product("One",5)
value[2] = new product("Two",3)
value[3] = new product("Three",8)

工作流程

  • textbox1textbox2textbox3中输入新产品的详细信息
  • 当我单击Add时,新产品将被添加到数组中:

    value[1] = new product("One",5)
    value[2] = new product("Two",3)
    value[3] = new product("Three",8)
    value[4] = new product("Four",2)

如何编写此代码?


第一行应更正为:private product[] value = new product[4] - Timmy
我看到你在回答几个答案时发布了相同的评论,说你不想使用List。有什么原因吗? - rossisdead
只是要注意,value[0]没有被初始化。虽然这可能是有意为之的。 - Steve Schnepp
1
private product[] value = new product[4]; 的意思是你分配了4个产品的空间。在C#中,数组从0开始编号,因此第一个赋值应该是value[0] = new product("One",5)而不是1。 - Sune Rievers
@Timmy,请不要在评论中发布编辑内容。您可以使用编辑按钮编辑您的原始帖子。谢谢。 - ShadowCrafter_01
7个回答

37

数组是固定大小的,这意味着您无法添加比在创建时分配的数量更多的元素。如果您需要一个自动调整大小的集合,可以使用 List<T> 或者 ArrayList

例如:

// using collection initializers to add two products at creation time
List<Product> products = new List<Product>{new Product("One",5), new Product("Two",3) };

// then add more elements as needed
products.Add(new Product("Three",8));

好的,谢谢大家的回答...我不想尝试使用列表方法...我会选择数组调整大小...在输入文本框中输入详细信息后,我应该如何在添加按钮中使用它:private void btnAdd_Click_1(object sender, EventArgs e) { Array.Resize<product>(ref value, 5); } 那ArrayList如何使用呢? - Timmy
1
Timmy,你应该使用对你来说更有意义的东西,但是你需要知道的是,List<T>ArrayList都使用一个私有数组,在添加或删除项目时会自动使用Array.Resize()进行调整大小。 - Pop Catalin
抱歉,我忘了提到我不想让它变得太大,因为目前只是一个测试...所以大约2个新产品就可以了... 这样会行吗: private product[] value = new product[5]; value[0] = new product("One",5) value[1] = new product("Two",3) value[2] = new product("Three",8)或者像这样:private product[] value = new product[5]; value[0] = new product("One",5) value[1] = new product("Two",3) value[2] = new product("Three",8) value[3] = new product(textBox1,textBox2) value[4] = new product(textBox1,textBox2) - Timmy

20

如其他人所建议,使用List。 如果你坚持要使用数组,使用

Array.Resize<Product>(ref product, your new size);

如果你只打算添加几个产品(在数组的生命周期内),只需像这样做:

Array.Resize<Product>(ref product, product.Length + 1);

如果你要添加大量的产品,你可能想要做类似于List的事情-像这样:

Array.Resize<Product>(ref product, product.Length * 2);

好的,谢谢大家的回答。我不想尝试使用List方法,我会使用数组调整大小...在输入文本框中输入详细信息后,我应该如何在添加按钮中使用它:private void btnAdd_Click_1(object sender, EventArgs e) { Array.Resize<product>(ref value, 5); } - Timmy
请注意,由于需要 ref 参数,因此此方法无法用于对象的属性。 - ryanwebjackson

3

你不能向数组中添加项目,你需要创建一个更大的新数组并将项目复制到其中。有一个方法可以实现这个功能,它的名称有些误导性,叫做Resize,但它实际上并不会调整数组的大小:

Array.Resize<product>(ref value, 5);

如果您想向集合中添加元素,应该使用List:
private List<product> value = new List<product>();
value.Add(new product("One",5));
value.Add(new product("Two",3));
value.Add(new product("Three",8));

value.Add(new product("Four",2));

编辑:
如果你想调整数组的大小,你可能想增加它的大小而不是将其调整为特定的值:

int index = value.Length;
Array.Resize<product>(ref value, index + 1);
value[index] = ...

好的,谢谢大家的回答...我不想尝试List方法...我会使用数组调整大小...在输入文本框中输入详细信息后,我应该如何在添加按钮中使用它: private void btnAdd_Click_1(object sender, EventArgs e) { Array.Resize<product>(ref value, 5); } - Timmy
是的,但使用零索引,您最好将其调整为四个,或者增加一个大小(请参见上面的编辑)。 - Guffa
你确定代码正确吗?我一直在收到错误信息:错误1:'System.Array.Resize<products>(ref products.value[], int)' 的最佳重载方法匹配存在一些无效参数。以及错误2:参数 '1' 必须使用 'ref' 关键字传递。 - Timmy
@Timmy:已更正。调用当然应该像第一个示例一样使用ref关键字。 - Guffa

3
我觉得你需要一个List<product>集合,看着你的代码。然后只需调用它的Add()方法即可。

好的,谢谢大家的回答。我不想尝试使用List方法,我会使用数组调整大小...在输入文本框中输入详细信息后,我应该如何在添加按钮中使用它:private void btnAdd_Click_1(object sender, EventArgs e) { Array.Resize<product>(ref value, 5); } - Timmy

0

数组是从零开始索引的,因此初始化为大小4的数组只能访问到索引3...

如果您想要数组增长,那么您必须将数组初始化为至少与您想要增长到的大小相同,或者您必须创建一个新的具有更大大小的数组并复制旧数组;这不是很高效。

在这种情况下,最好使用像列表这样的集合,而不是数组,以便大小可以动态增加。


我知道了,但它还是不起作用...嗯??如果数组索引设置为[0]到[4],现在可能出了什么问题?我需要在开始时将其声明为空数组吗,如下所示: value [0] = new product("One",5) value [1] = new product("Two",3) value [2] = new product("Three",8) value [3] = new product {textbox1,textbox2} - Timmy
哇,真不敢相信我也没发现这个问题。@Timmy,你的value[1] = new product("One",5) 应该改为 value[0] = new product("One",5)。 - J.Hendrix
抱歉,我忘记提到现在它不应该变得太大,因为这只是一个测试...所以大约2个新产品就足够了...这样可以吗:private product[] value = new product[5];value[0] = new product("One", 5); value[1] = new product("Two", 3); value[2] = new product("Three", 8);或者像这样:private product[] value = new product[5];value[0] = new product("One", 5); value[1] = new product("Two", 3); value[2] = new product("Three", 8); value[3] = new product(textBox1, textBox2); value[4] = new product(textBox1, textBox2); - Timmy

0

0

Array.Resize不是一种高效的方法。它会创建一个新的数组,然后将旧数组的值复制到新数组中,最后用新数组替换旧数组。

可以看出,这不是一种非常有效的追加项目的方式,除非你没有控制权,必须使用List代替数组或从一开始就创建具有最大预期维度的数组。

为了更好地解释,考虑以下示例: 你创建了一个可以容纳一百万个项目并填充对象的数组。 你想要将第一百万零一个对象添加到数组中。 你使用Array.Resize方法将数组大小更改为1000001。 当该方法尝试创建一个包含1000001个项目的新数组并将项目从旧数组复制到新数组时,你可能会遇到内存不足错误,因为你正在尝试在同一时间内将两个包含一百万个项目(共计200万个对象)的数组保存在内存中,而你所需的所有项目只有一百万+1个。 尽管如此,请考虑在创建、复制和替换中浪费的时间和资源。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接