【问题标题】:How to add to end of array C#?如何添加到数组 C# 的末尾?
【发布时间】:2010-12-22 15:48:19
【问题描述】:

如何在引用类的 ArrayList 末尾处的 Windows 窗体上的文本框和按钮中添加新的 item

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)

执行此操作的代码是什么?

【问题讨论】:

  • 更正的第一行应该是:私有产品[] value = new product[4] Timmy
  • 我看到您发布了相同的评论以回应一些回答说您不想使用列表。有什么原因吗?
  • 请注意 value[0] 未初始化。不过,这可能是故意的。
  • private product[] value = new product[4]; 表示您为 4 个产品分配了位置。数组在 C# 中是零索引的,因此第一个赋值行应该是 value[0] = new product("One",5) 而不是 1。
  • @Timmy 请不要在 cmets 中发布编辑。您可以使用编辑按钮编辑您的原始帖子。谢谢

标签: c# .net winforms arrays


【解决方案1】:

数组是固定大小的,这意味着你不能添加比创建时分配的数量更多的元素,如果你需要一个自动调整大小的集合,你可以使用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));

【讨论】:

  • 好的,谢谢大家的回答....我不想尝试 List 方法...我将使用数组调整大小...我会在以下方式中使用它吗?在文本框中输入详细信息后添加按钮: private void btnAdd_Click_1(object sender, EventArgs e) { Array.Resize(ref value, 5);我将如何使用 ArrayList?
  • Timmy,你应该使用任何对你更有意义的东西,但你知道,List&lt;T&gt;ArrayList 都在内部使用一个私有数组,该数组使用 Array.Resize() 自动调整大小添加或删除项目。
  • 好吧对不起忘了提我不希望它变大,因为它现在是一个测试......所以大约有 2 个新产品可以......这会工作吗:私人产品[]价值=新产品[5]; value[0] = new product("One",5) value[1] = new product("Two",3) value[2] = new product("Three",8) 或者像这样:私人产品[]价值=新产品[5]; value[0] = new product("一",5) value[1] = new product("二",3) value[2] = new product("三",8) value[3] = new product( textBox1,textBox2) 值[4] = 新产品(textBox1,textBox2)
【解决方案2】:

像其他人提到的那样使用列表。 如果您设置在数组上,请使用

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 方法...我将使用 Array 调整大小...我会在以下方式中使用它吗?在文本框中输入详细信息后添加按钮: private void btnAdd_Click_1(object sender, EventArgs e) { Array.Resize(ref value, 5); }
  • 请注意,由于需要 ref 参数,因此该方法不能用于对象的属性。
【解决方案3】:

我认为您需要一个 List&lt;product&gt; 集合,查看您的代码。然后直接调用Add()方法就可以了

【讨论】:

  • 好的,谢谢大家的回答....我不想尝试 List 方法...我将使用数组调整大小...我会在以下方式中使用它吗?在文本框中输入详细信息后添加按钮: private void btnAdd_Click_1(object sender, EventArgs e) { Array.Resize(ref value, 5); }
【解决方案4】:

您不能将项目添加到数组中,您必须创建一个更大的新数组并将项目复制到其中。有一种方法可以做到这一点,它的名称有点误导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(ref value, 5); }
  • 是的,但是使用零索引您宁愿将其大小调整为四,或者可能将大小增加一(参见上面的编辑)。
  • 您确定代码正确吗?我开始错误:错误 1 ​​'System.Array.Resize(ref products.value[], int)' 的最佳重载方法匹配有一些无效参数,错误 2 参数 '1' 必须与 'ref 一起传递'关键字
  • @Timmy:已更正。调用当然应该有 ref 关键字,就像在第一个示例中一样。
【解决方案5】:

数组是零索引的,所以一个初始化为 4 的数组只能被访问到索引 3...

如果您希望数组增长,那么您必须将数组初始化为至少与您希望能够增长到的一样大,否则您必须创建一个新的更大的数组大小并复制旧数组;效率不高。

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

【讨论】:

  • 好的,我已经知道了,但它不起作用....嗯??如果索引的数组设置为 [0] 到 [4],现在可能会出现什么问题?我是否需要在开始时将其声明为空数组: value[0] = new product("One",5) value[1] = new product("Two",3) value[2] = new product ("三",8) value[3] = new product{textbox1,textbox2} ?
  • +1 哇,真不敢相信我也没听懂。 @Timmy,你的 value[1] = new product("One",5) 应该真的读 value[0] = new product("One",5)
  • 抱歉忘了提我不希望它变大,因为它现在是一个测试......所以大约有 2 个新产品可以......这是否可行:私人产品 [] 价值= 新产品[5]; value[0] = new product("One",5) value[1] = new product("Two",3) value[2] = new product("Three",8) 或者像这样:私人产品[]价值=新产品[5]; value[0] = new product("一",5) value[1] = new product("二",3) value[2] = new product("三",8) value[3] = new product( textBox1,textBox2) 值[4] = 新产品(textBox1,textBox2)
【解决方案6】:

您可能还应该看看Array versus List: When to use which?

【讨论】:

    【解决方案7】:

    Array.Resize 不是一种有效的方法。它创建一个具有新大小的新数组,然后将旧数组值复制到新数组,然后用新数组替换旧数组。 如您所见,这不是一种非常有效的附加项目的方法。

    除非要求您无法控制使用列表而不是数组或从一开始就创建具有最大预期维度的数组。

    有关更多解释,请考虑以下示例: 您创建了一个可以容纳数百万个项目并用对象填充它的数组。 您想将百万零一个对象添加到数组中。 您使用 Array.Resize 方法将数组大小更改为 1000001。 当该方法尝试创建一个包含 1000001 个项目的新数组并将项目从旧数组复制到新数组时,您可能会遇到内存不足错误,因为您试图在内存中拥有两个一百万个数组(保存 2 百万个对象)同时你需要的所有物品都是一百万+1。 尽管考虑在创建、复制和替换过程中损失的时间和资源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 2023-03-07
      • 2013-08-18
      • 2015-04-17
      相关资源
      最近更新 更多