Подтвердить что ты не робот

Как расширить массивы в С#

Мне нужно выполнить упражнение с использованием массивов. Пользователь должен ввести 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();
}

Итак, мой вопрос сводится к следующему:

  • Как я могу позволить пользователю вводить более одной партии ввода? Например, первый раз, когда пользователь вводит информацию об элементе (номер сокета, цена и имя), но мне нужно разрешить пользователю вводить дополнительную информацию о другом элементе?

  • Как я могу показать номер сокета, цену и имя для каждого элемента массива на основе предположения, что у меня есть несколько элементов в массиве?

4b9b3361

Ответ 1

В .NET(С#) массив не изменяется. Это не так, как в JavaScript или PHP, массив был сделан очень гибким и может быть расширен с произвольными элементами.

Для определения статический массив по умолчанию имеет размер исправления, поэтому вы можете ссылаться на элемент внутри, используя индекс. (http://en.wikipedia.org/wiki/Array_data_structure#Array_resizing) Но там вы можете прочитать о динамическом массиве. В С# это будет 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();

Ответ 2

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

Учтите, что три элемента (номер запаса, цена и имя) являются частью более крупного объекта. На данный момент мы можем просто называть его item. Мы хотим сохранить число 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);
}

Ответ 3

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

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

Ссылка MSDN здесь.

Ответ 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 = a2;

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

Ответ 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, таких как массивы. Это позволит вам расширить массив:

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