【问题标题】:How to extend arrays in C#如何在 C# 中扩展数组
【发布时间】:2009-03-09 23:31:59
【问题描述】:

我必须使用数组做一个练习。用户必须输入 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. 如果我在数组中有多个项目的假设,我如何显示数组中每个项目的套接字编号、价格和名称?

【问题讨论】:

    标签: c# arrays input


    【解决方案1】:

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

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

    MSDN 链接是here

    【讨论】:

      【解决方案2】:

      在 .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();
      

      【讨论】:

        【解决方案3】:

        我认为你可能是在解决问题......

        考虑这三个项目(库存编号、价格和名称)是一个更大对象的一部分。现在我们可以称之为item。我们想在一个列表或数组中存储多个items。考虑使用这样的面向对象方法:

        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);
        }
        

        【讨论】:

        • 虽然确实有更好的方法来做到这一点,但他的问题是家庭作业,这可能意味着他需要使用数组。
        • 我同意 Mystere Man 的观点,我认为重点不是最好的方法,它更有可能强调数组大小是固定的这一事实并找出解决方法。
        • 感谢您的帮助..但我尝试使用此代码..但如果我不写任何输入,它会给我一个已处理的异常..
        • 是的——确实需要进行更多检查以处理无效输入。 cmets“这不是很安全”是这个问题可能发生的地方。
        • @ErikFunkenbusch 或者,12 年后,我们中的一些人想要调整数组的大小。不要将问题的示例或动机与提出的问题混淆。因为今天我需要一个问题的答案。
        【解决方案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;
        

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

            • 不允许有多个类 .. 所以股票信息必须由用户输入,添加它们并在同一个类中显示它们,但使用 additems 和 display items 两种方法..
            【解决方案7】:

            你能用ArrayList 代替吗?它将根据需要调整大小。

            【讨论】:

            • 应该使用通用列表而不是 ArrayList。 ArrayList 基本上是 List,因此可以保存任何随机对象,而不是它本来应该保存的对象。
            • 如果我使用数组作为数组列表没关系.. 但我不知道如何在 C# 中使用数组列表
            【解决方案8】:

            我遇到了同样的问题,但无法更改类型并且不得不坚持使用 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();
                }
            

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

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                【解决方案10】:

                如果您可以访问 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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-04-16
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-03-31
                  • 1970-01-01
                  相关资源
                  最近更新 更多