Question

Je dois faire un exercice en utilisant des tableaux. L'utilisateur doit entrer 3 entrées (à chaque fois, des informations sur les éléments) et les entrées seront insérées dans le tableau. Ensuite, je dois afficher le tableau.

Cependant, j'ai du mal à augmenter la longueur du tableau sans changer les informations qu'il contient; et comment puis-je permettre à l'utilisateur d'entrer un autre jeu d'entrées? C’est ce que j’ai jusqu’à présent:

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

Donc ma question se résume à:

  1. Comment puis-je permettre à l'utilisateur de saisir plus d'un lot d'entrées? Par exemple, la première fois que l'utilisateur saisira les informations relatives à l'élément (numéro de socket, prix et nom), mais je dois lui permettre d'entrer davantage d'informations sur un autre élément?

  2. Comment puis-je afficher le numéro de socket, le prix et le nom de chaque élément du tableau en supposant que j'ai plusieurs éléments dans le tableau?

Était-ce utile?

La solution

Dans .NET (C #), un tableau n'est pas redimensionnable. Ce n'est pas comme en JavaScript ou en PHP où un tableau est rendu très flexible et peut être étendu avec des éléments arbitraires.

Par définition, un tableau statique par défaut a une taille de correctif, vous pouvez donc référencer un élément à l'intérieur à l'aide de l'index. ( http://fr.wikipedia.org/wiki/Array_data_structure#Array_resizing ) Mais là vous pouvez lire sur le tableau dynamique. En C #, il s'agira de l'objet System.Collections.ArrayList. ( http://fr.wikipedia.org/wiki/Dynamic_array )

Donc, ce dont vous avez besoin, c'est soit ArrayList-Definition, soit une liste normale, soit une liste générique. (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();

Autres conseils

À partir de .NET Framework 3.5, vous pouvez utiliser la Array.Resize<T> méthode:

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

Le lien MSDN est ici .

Je pense que vous vous trompez peut-être dans le problème ...

Considérez que les trois articles (numéro de stock, prix et nom) font partie d’un objet plus grand. Pour l'instant, nous pouvons simplement l'appeler item. Nous voulons stocker un certain nombre de <=> s dans une liste ou un tableau. Pensez à utiliser une approche orientée objet comme celle-ci:

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

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

Vous pouvez maintenant instancier une liste de ces objets:

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

Et ajoutez-y des éléments:

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

En supposant que votre affectation nécessite l'utilisation de tableaux et non d'autres classes de collection, vous devrez alors faire les choses à la dure.

Les tableaux sont immuables, c'est-à-dire que vous ne pouvez pas les modifier après leur création. Vous pouvez modifier le contenu, mais pas la taille du tableau. Si vous devez agrandir ou réduire le tableau, vous devez créer un nouveau tableau avec le nouveau nombre d'éléments, puis copier les éléments souhaités de l'ancien tableau dans le nouveau.

Par exemple, supposons que vous vouliez prendre un tableau et ne copier que les éléments pairs.

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

Ensuite, vous pouvez toujours affecter a2 à un

a = a2;

Vous pouvez utiliser System.Collections.Generic.List<T> qui fournit une collection redimensionnable qui dispose également d'une méthode .ToArray() pour renvoyer un tableau ordinaire si vous en avez besoin.

Utilisez une liste, puis convertissez-le en tableau.

En fait, dans cet exemple, vous devez avoir une classe ou une structure pour StockInfo {numéro de stock, prix, nom de l'élément}, puis vous devez entrer les données dans une liste. Enfin, vous pouvez convertir en StockInfo [] en utilisant la méthode ToArray de la liste.

Pouvez-vous utiliser ArrayList ? Il sera redimensionné si nécessaire.

J'ai le même problème mais je ne peux pas changer le type et je dois rester bloqué avec Array puisque j'étendais une classe d'API existante. Voici une méthode de modèle simple qui étend un tableau existant:

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

Notez que ce qui précède initialise également les éléments avec le constructeur par défaut.

Vous pouvez contourner le "problème" de ne pas pouvoir redimensionner les tableaux en utilisant un tableau aussi grand que le plus grand que vous attendiez. Notez que ceci est considéré comme du piratage, pas de la programmation structurée!

Si vous avez accès à System.Linq, vous pouvez utiliser la méthode d'extension pratique Concat pour les objets IEnumerable tels que les tableaux. Cela vous permettra d’étendre un tableau:

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

Résultat:
1
2
3
4

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top