-2

我想通过用户输入将元素添加到我的数组中。我知道使用列表可以很容易地做到这一点,但我必须使用数组。

代码的问题是array.lenght 将始终为1。我希望数组的大小与其中元素的总数相同,因此在声明数组时不应设置数组的大小。

我认为如果您将元素添加到数组中,它将复制先前的值 + 添加的值并创建一个新数组。

已更新答案

  public static void Add(int x){

     if (Item == null)  // First time need to initialize your variable
     {
         Item = new int[1];
     }
     else
     {
         Array.Resize<int>(ref Item, Item.Length + 1);
     }
     Item[Item.Length-1] = x; //fixed Item.Length -> Item.Length-1
 }
4

3 回答 3

1

使用List<int>而不是显式数组,它将为您动态调整大小,并使用 Add() 方法在最后添加元素。

于 2013-04-07T18:03:04.807 回答
0

列表会随着您向其中添加元素而增长。数组具有恒定的大小。如果必须使用数组,最简单的方法是创建一个足够大的数组来容纳输入的元素。

private int[] _items = new int[100];
private int _count;

public void Add(int x)
{
    _items[_count++] = x;
}

您还需要跟踪已插入的元素数量(我在_count这里使用了该字段);


例如,您可以像这样枚举所有项目:

for (int i = 0; i < _count; i++) {
    Console.WriteLine(_items[i]);
}

您可以像这样公开访问这些项目:

public int[] Items { get { return _items; } }

public int Count  { get { return _count; } }

更新

如果要自动增加数组大小,最好在数组变得太小时时将实际大小加倍。这是速度和内存效率之间的一个很好的折衷(这就是列表内部的工作方式)。

private int[] _items = new int[8];
private int _count;

public void Add(int x)
{
   if (_count == _items.Lengh) {
       Array.Resize(ref _items, 2 * _items.Length);
   }
    _items[_count++] = x;
}

但是,请记住,这会更改数组引用。因此,不应将此数组引用的永久副本存储在其他任何地方。

于 2013-04-07T18:03:59.973 回答
0

我没有在VS中测试。干得好:

namespace ConsoleApplication1
{
    class Program
    {
        static int[] Item; //Fixed int Item[] to int[] Item
        static void Main(string[] args)
        {
            Add(3);
            Add(4);
            Add(6);
        }


     public static void Add(int x){

         if (Item == null)  // First time need to initialize your variable
         {
             Item = new int[1];
         }
         else
         {
             Array.Resize<int>(ref Item, Item.Length + 1);
         }
         Item[Item.Length-1] = x; //fixed Item.Length -> Item.Length-1
     }

    }
}

这应该每次将您的数组大小调整一个,然后将最后一项设置为您要添加的内容。请注意,这是非常低效的。

于 2013-04-07T18:12:50.000 回答