Как расширить массивы в C # - PullRequest
13 голосов
/ 10 марта 2009

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

Ответы [ 10 ]

19 голосов
/ 01 декабря 2014

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

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

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

16 голосов
/ 21 декабря 2011

В .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();
7 голосов
/ 10 марта 2009

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

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

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

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

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

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;
3 голосов
/ 10 марта 2009

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

2 голосов
/ 10 марта 2009

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

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

0 голосов
/ 22 января 2013

Если у вас есть доступ к System.Linq, вы можете использовать удобный метод расширения Concat для 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

0 голосов
/ 21 декабря 2011

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

0 голосов
/ 08 февраля 2011

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

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

0 голосов
/ 10 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...