20

我必须使用数组做一个练习。用户必须输入 3 个输入(每次输入有关项目的信息),输入将被插入到数组中。然后我必须显示数组。

但是,我很难在不更改其中信息的情况下增加数组的长度;以及如何允许用户输入另一组输入?这是我到目前为止所拥有的:

public string stockNum;
public string itemName;
public string price;

string[] items = new string[3];

public string [] addItem(string[] items)
{
    System.Console.WriteLine("Please Sir Enter the stock number");
    stockNum = Console.ReadLine();
    items.SetValue(stockNum, 0);
    System.Console.WriteLine("Please Sir Enter the price");
    price = Console.ReadLine();
    items.SetValue(price, 1);
    System.Console.WriteLine("Please Sir Enter the item name");
    itemName = Console.ReadLine();
    items.SetValue(itemName, 2);
    Array.Sort(items);
    return items;
}


public void ShowItem()
{
    addItem(items);
    Console.WriteLine("The stock Number is " + items[0]);
    Console.WriteLine("The Item name is " + items[2]);
    Console.WriteLine("The price " + items[1]);
}

static void Main(string[] args)
{
    DepartmentStore depart = new DepartmentStore();
    string[] ar = new string[3];
    // depart.addItem(ar);
    depart.ShowItem();
}

所以我的问题归结为:

  1. 如何允许用户输入多于一批的输入?例如,用户第一次会输入有关商品的信息(插座编号、价格和名称),但我需要允许用户输入有关其他商品的更多信息吗?

  2. 基于数组中有多个项目的假设,如何显示数组中每个项目的套接字编号、价格和名称?

4

10 回答 10

43

从 .NET Framework 3.5 开始,对于一维数组,您可以使用Array.Resize<T>以下方法:

int[] myArray = { 1, 2, 3 };
Array.Resize(ref myArray, 5);

MSDN 链接在这里

于 2014-12-01T14:40:00.610 回答
20

在 .NET (C#) 中,数组不可调整大小。与 JavaScript 或 PHP 不同,数组变得非常灵活并且可以使用任意元素进行扩展。

根据定义,默认静态数组具有固定大小,因此您可以使用索引来引用其中的元素。(http://en.wikipedia.org/wiki/Array_data_structure#Array_resizing)但是您可以在那里阅读有关动态数组的信息。在 C# 中,它将是 System.Collections.ArrayList-Object。(http://en.wikipedia.org/wiki/Dynamic_array

因此,您需要的是 ArrayList-Definition 或普通列表或通用列表。(System.Collections.Generic.List)

string[] items = new string[3] { "input1", "input2", "input3" };
string[] moreItems = new string[10] { "input4", "input5" };

// array to list
List<string> itemsList = items.ToList<string>();

itemsList.Add("newItem");
// or merge an other array to the list
itemsList.AddRange(moreItems);

// list to array
string[] newArray = itemsList.ToArray();
于 2011-12-21T10:47:57.080 回答
7

我想你可能是在处理错误的问题......

考虑这三个项目(股票编号、价格和名称)是一个更大对象的一部分。现在我们可以直接调用它item。我们希望item在列表或数组中存储多个 s。考虑使用这样的面向对象方法:

class Widget
{
  public int StockNum;
  public int Price;
  public string Name;

  Widget(stockNum, price, name)
  {
    this.StockNum= stockNum;
    this.Price = price;
    this.Name = name;
  }
}

现在,您可以实例化这些对象的列表:

List<Widget> items = new List<Widget>();

并向它们添加项目:

for (int i = 0; i < 5; i++)
{
  //Get input from user
  System.Console.WriteLine("Please Sir Enter the stock number");
  stockNum= Convert.ToInt32(Console.ReadLine()); //This isn't very safe...

  System.Console.WriteLine("Please Sir Enter the price");
  price = Convert.ToInt32(Console.ReadLine()); //This isn't very safe...

  System.Console.WriteLine("Please Sir Enter the item name");
  name = Console.ReadLine();

  //Then add it to a new object
  Widget item = new Widget(stockNum, price, name);

  //And add this item to a list
  items.Add(item);
}
于 2009-03-09T23:39:12.373 回答
4

假设您的任务要求您使用数组而不是其他集合类,那么您将不得不以艰难的方式做事。

数组是不可变的,也就是说你不能在它们创建后更改它们。您可以更改内容,但不能更改数组的大小。如果您需要扩大或缩小数组,则必须使用新的项目数创建一个新数组,然后将所需的项目从旧数组复制到新数组。

例如,假设您想获取一个数组并且只复制偶数元素。

int[] a = new int[] {0,1,2,3,4,5,6,7,8,9};
int[] a2 = new int[a.Length / 2];
int counter = 0;
for (int i = 0; i < a.Length; i = i + 2)
{
    a2[counter++] = a[i];
}

然后,您总是可以将 a2 分配回 a

a = a2;
于 2009-03-10T00:09:10.133 回答
3

您可以使用System.Collections.Generic.List<T>which 提供一个可调整大小的集合,.ToArray()如果需要,它还具有返回普通数组的方法。

于 2009-03-09T23:37:12.350 回答
2

使用列表,然后转换为数组。

事实上,在这个例子中,你应该有一个 StockInfo {stock number, price, item name} 的类或结构,然后你应该将数据输入到一个列表中。最后,您可以使用列表的 ToArray 方法转换为 StockInfo[]。

于 2009-03-09T23:38:49.927 回答
0

你可以改用ArrayList吗?它将根据需要调整大小。

于 2009-03-09T23:37:55.107 回答
0

我遇到了同样的问题,但无法更改类型并且不得不坚持使用 Array,因为我正在扩展现有的 API 类。这是一个扩展现有数组的简单模板方法:

    public static T[] ExtendArray<T> ( T[] array , uint index) where T:new()
    {
        List<T> list = new List<T>();
        list.AddRange(array);

        while (list.Count < index) {
            list.Add(new T());
        }

        return list.ToArray();
    }

请注意,上面还使用默认构造函数初始化元素。

于 2011-02-08T12:35:27.280 回答
0

您可以通过使用与您期望的最大数组一样大的数组来解决无法调整数组大小的“问题”。请注意,这被认为是黑客攻击,而不是结构化编程!

于 2011-12-21T11:24:51.597 回答
0

如果您有权访问 System.Linq,那么您可以对 IEnumerable 对象(例如数组)使用方便的扩展方法Concat 。这将允许您扩展数组:

int[] result = new int[] { 1, 2 };
int[] extend = new int[] { 3, 4 };

result = result.Concat(extend).ToArray();

foreach (int i in result)
{
    Console.WriteLine(i.ToString());
}

结果:
1
2
3
4

于 2013-01-22T18:39:21.703 回答