Domanda

Devo fare un esercizio usando le matrici. L'utente deve inserire 3 ingressi (ogni volta, informazioni sugli articoli) e gli ingressi verranno inseriti nell'array. Quindi devo visualizzare l'array.

Tuttavia, sto avendo difficoltà ad aumentare la lunghezza dell'array senza modificare le informazioni al suo interno; e come posso consentire all'utente di inserire un altro set di input? Questo è quello che ho finora:

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

Quindi la mia domanda si riduce a:

  1. Come posso consentire all'utente di inserire più di un batch di input? Ad esempio, la prima volta che l'utente inserirà le informazioni sull'articolo (numero socket, prezzo e nome), ma devo consentire all'utente di inserire ulteriori informazioni su un altro articolo?

  2. Come posso visualizzare il numero di socket, il prezzo e il nome di ciascun articolo nell'array in base al presupposto che io abbia più di un articolo nell'array?

È stato utile?

Soluzione

In .NET (C #), un array non è ridimensionabile. Non è come in JavaScript o PHP dove un array è reso molto flessibile e può essere esteso con elementi arbitrari.

Per definizione un array statico predefinito ha una dimensione fissa, quindi puoi fare riferimento a un elemento all'interno usando l'indice. ( http://en.wikipedia.org/wiki/Array_data_structure#Array_resizing ) Ma lì puoi leggere sull'array dinamico. In C # sarà System.Collections.ArrayList-Object. ( http://en.wikipedia.org/wiki/Dynamic_array )

Quindi ciò di cui hai bisogno è ArrayList-Definition o un normale elenco o un elenco generico. (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();

Altri suggerimenti

A partire da .NET Framework 3.5, per gli array unidimensionali è possibile utilizzare il metodo Array.Resize<T>:

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

Il collegamento MSDN è qui .

Penso che potresti aver sbagliato il problema ...

Considera che i tre articoli (numero di magazzino, prezzo e nome) fanno parte di un oggetto più grande. Per ora possiamo semplicemente chiamarlo item. Vogliamo memorizzare un numero di <=> s in un elenco o array. Prendi in considerazione l'utilizzo di un approccio orientato agli oggetti come questo:

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

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

Ora puoi creare un'istanza di un elenco di questi oggetti:

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

E aggiungi elementi ad essi:

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

Supponendo che il tuo compito richieda l'uso di array e non di altre classi di raccolta, dovrai fare le cose nel modo più difficile.

Le matrici sono immutabili, ovvero non è possibile modificarle dopo che sono state create. È possibile modificare il contenuto, ma non le dimensioni dell'array. Se è necessario espandere o ridurre l'array, sarà necessario creare un nuovo array con il nuovo numero di elementi, quindi copiare gli elementi desiderati dal vecchio array nel nuovo array.

Ad esempio, supponiamo che tu voglia prendere un array e copiare solo gli elementi pari.

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

Quindi, puoi sempre assegnare a2 indietro a a

a = a2;

Puoi usare System.Collections.Generic.List<T> che fornisce una raccolta ridimensionabile che ha anche un metodo .ToArray() per restituire un array ordinario se ne hai bisogno.

Utilizza un elenco, quindi converti in un array.

In effetti, in questo esempio, dovresti avere una classe o una struttura per StockInfo {numero di azioni, prezzo, nome articolo}, quindi devi inserire i dati in un Elenco. Infine, è possibile convertire in StockInfo [] utilizzando il metodo ToArray dell'elenco.

Puoi invece utilizzare ArrayList ? Si ridimensionerà secondo necessità.

Ho avuto lo stesso problema ma non ho potuto cambiare il tipo e ho dovuto rimanere bloccato con Array da quando stavo estendendo una classe API esistente. Ecco un semplice metodo modello che estende un array esistente:

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

Nota che anche inizializza gli elementi con il costruttore predefinito.

Potresti aggirare il 'problema' di non essere in grado di ridimensionare gli array usando un array grande quanto l'array più grande che ti aspetti di avere. Nota che questo è considerato un hacking, non una programmazione strutturata!

Se hai accesso a System.Linq, puoi utilizzare il pratico metodo di estensione Concat per oggetti IEnumerable come gli array. Ciò ti consentirà di estendere un array:

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

Risultato:
1 Pagina 2 Pagina 3 Pagina 4

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top