Pregunta

Tengo que hacer un ejercicio usando matrices. El usuario debe ingresar 3 entradas (cada vez, información sobre los elementos) y las entradas se insertarán en la matriz. Entonces debo mostrar la matriz.

Sin embargo, estoy teniendo dificultades para aumentar la longitud de la matriz sin cambiar la información que contiene; y ¿cómo puedo permitir que el usuario ingrese otro conjunto de entrada? Esto es lo que tengo hasta ahora:

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

Entonces mi pregunta se reduce a:

  1. ¿Cómo puedo permitir que el usuario ingrese más de un lote de entrada? Por ejemplo, la primera vez que el usuario ingresará la información sobre el artículo (número de socket, precio y nombre), pero ¿debo permitir que el usuario ingrese más información sobre otro artículo?

  2. ¿Cómo puedo mostrar el número de socket, el precio y el nombre de cada elemento de la matriz en el supuesto de que tengo más de un elemento en la matriz?

¿Fue útil?

Solución

En .NET (C #), una matriz no es redimensionable. No es como en JavaScript o PHP donde una matriz se hace muy flexible y se puede ampliar con elementos arbitrarios.

Por definición, una matriz estática predeterminada tiene un tamaño fijo, por lo que puede hacer referencia a un elemento dentro mediante el índice. ( http://en.wikipedia.org/wiki/Array_data_structure#Array_resizing ) Pero allí puedes leer sobre matriz dinámica. En C # será el System.Collections.ArrayList-Object. ( http://en.wikipedia.org/wiki/Dynamic_array )

Entonces, lo que necesita es ArrayList-Definition o una lista normal o genérica. (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();

Otros consejos

Comenzando con .NET Framework 3.5, para matrices unidimensionales puede usar el método Array.Resize<T>:

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

El enlace MSDN está aquí .

Creo que es posible que el problema esté yendo mal ...

Tenga en cuenta que los tres artículos (número de inventario, precio y nombre) son parte de un objeto más grande. Por ahora podemos llamarlo item. Queremos almacenar una cantidad de <=> s en una lista o matriz. Considere utilizar un enfoque orientado a objetos como este:

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

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

Ahora, puede crear una instancia de una lista de estos objetos:

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

Y agregue elementos a ellos:

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

Suponiendo que su tarea requiere que use Matrices y no otras clases de colección, entonces tendrá que hacer las cosas de la manera difícil.

Las matrices son inmutables, es decir, no puede cambiarlas después de que se hayan creado. Puede cambiar el contenido, pero no el tamaño de la matriz. Si necesita aumentar o reducir la matriz, tendrá que crear una nueva matriz con la nueva cantidad de elementos, luego copie los elementos que desee de la matriz anterior a la nueva matriz.

Por ejemplo, suponga que desea tomar una matriz y solo copiar los elementos pares.

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

Entonces, siempre puedes asignar a2 a

a = a2;

Puede usar System.Collections.Generic.List<T> que proporciona una colección redimensionable que también tiene un método .ToArray() para devolver una matriz ordinaria si la necesita.

Use una lista y luego conviértala en una matriz.

De hecho, en este ejemplo, debe tener una clase o estructura para StockInfo {número de inventario, precio, nombre del artículo}, luego debe ingresar los datos en una Lista. Finalmente, puede convertir a StockInfo [] utilizando el método ToArray de la lista.

¿Puede usar ArrayList ? Se redimensionará según sea necesario.

He tenido el mismo problema pero no pude cambiar el tipo y tuve que quedarme con Array porque estaba ampliando una clase API existente. Aquí hay un método de plantilla simple que extiende una matriz existente:

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

Tenga en cuenta que lo anterior también inicializa los elementos con el constructor predeterminado.

Podría solucionar el 'problema' de no poder cambiar el tamaño de las matrices utilizando una matriz que sea tan grande como la matriz más grande que espera tener. ¡Tenga en cuenta que esto se considera piratería, no programación estructurada!

Si tiene acceso a System.Linq, puede usar el práctico método de extensión Concat para objetos IEnumerable como arrays. Esto le permitirá extender una matriz:

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

Resultado:
1
2
3
4

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top