Вопрос

Мне нужно выполнить упражнение с использованием массивов.Пользователь должен ввести 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. Как я могу отобразить номер сокета, цену и имя для каждого элемента в массиве, исходя из предположения, что у меня есть более одного элемента в массиве?

Это было полезно?

Решение

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

Другие советы

Начиная с .NET Framework 3.5, для одномерных массивов вы можете использовать метод Array.Resize<T>:

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

Ссылка MSDN находится здесь .

Я думаю, вы можете решить проблему неправильно ...

Учтите, что три предмета (номер акции, цена и название) являются частью более крупного объекта. Сейчас мы можем просто назвать это item. Мы хотим сохранить число <=> в списке или массиве. Подумайте об использовании объектно-ориентированного подхода, подобного этому:

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

Если ваше назначение требует от вас использования массивов, а не других классов коллекций, то вам придется делать все трудным образом.

Массивы являются неизменяемыми, то есть вы не можете изменить их после того, как они были созданы. Вы можете изменить содержимое, но не размер массива. Если вам нужно увеличить или уменьшить массив, вам нужно будет создать новый массив с новым количеством элементов, а затем скопировать нужные элементы из старого массива в новый.

Например, предположим, что вы хотите взять массив и скопировать только четные элементы.

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 = a2;

Вы можете использовать System.Collections.Generic.List<T>, который предоставляет коллекцию с изменяемым размером, которая также имеет метод .ToArray() для возврата обычного массива, если он вам нужен.

Используйте список, а затем преобразовать в массив.

На самом деле, в этом примере у вас должен быть класс или структура для StockInfo {номер акции, цена, наименование товара}, затем вы должны ввести данные в список. Наконец, вы можете преобразовать в StockInfo [], используя метод списка ToArray.

Можете ли вы использовать вместо этого ArrayList ? Он будет изменен по мере необходимости.

У меня была та же проблема, но я не мог изменить тип, и мне пришлось придерживаться 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();
    }

Обратите внимание, что приведенное выше также инициализирует элементы конструктором по умолчанию.

Вы можете обойти «проблему» невозможности изменить размеры массивов, используя массив, размер которого не превышает размера самого большого массива, который вы ожидаете получить. Обратите внимание, что это считается взломом, а не структурированным программированием!

Если у вас есть доступ к System.Linq, вы можете использовать удобный метод расширения. Конкат для объектов IEnumerable, таких как массивы.Это позволит вам расширить массив:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top