3 votes

Appliquer "nouveau" à une seule dimension d'un tableau multidimensionnel ?

J'ai ce programme C#, et il a le code suivant :

/*10 data for one peprson */
private int[] data = new int[10];
private void SomeMethod()
{   
    /*More code*/
    this.data = new int[10];
    /*More code*/
}

Ce programme appelle cette méthode lorsqu'un événement se produit, et chaque fois que cela se produit, ce tableau unidimensionnel obtient une "nouvelle" instance d'un tableau de taille 10, et rafraîchit le tableau. C'est un peu comme le réinitialiser.

Maintenant, on me demande d'écrire un nouveau programme qui fait la même chose, sauf qu'il y a maintenant 5 personnes. J'ai donc créé un tableau à deux dimensions comme suit

private int[,] data = new int[5, 10];

qui sera capable de stocker 10 données pour chacune des 5 personnes. Je ne sais pas comment rafraîchir/réinitialiser les données d'une seule personne dans ce tableau à deux dimensions. J'ai essayé

private void SomeMethod(int index) /*index 0 - 4 for each of the 5 people*/
{
     this.data[index] = new int[10];
}

mais cela ne fonctionne manifestement pas, et je reçois une erreur disant qu'il me manque une dimension. Existe-t-il un moyen d'y parvenir ? Pour l'instant, j'utilise

private void SomeMethod(int index) /*index 0 - 4 for each of the 5 people*/
{
     for(int i=0; i<10; i++)
         this.data[index, i] = 0;
}

Lorsque je l'ai testé avec le code original, j'ai remarqué qu'à chaque fois qu'il obtenait une "nouvelle" instance, il assignait des 0 au tableau. Maintenant, la différence est que le code original fait référence à la nouvelle instance sans données (et donc avec 0 ?), et que le code réécrit écrase les données avec des 0.

Est-ce que les deux fonctionnent de la même manière, du point de vue des fonctions du programme ?

4voto

Joel Coehoorn Points 190579

Il n'y a rien de mal avec le code que vous avez. Il est même probablement plus rapide que la création d'un nouveau tableau. Mais si vous le voulez vraiment, vous pouvez utiliser un tableau en dents de scie à la place :

private int[][] data = new int[5][];

//...

private void SomeMethod(int index) /*index 0 - 4 for each of the 5 people*/
{
     this.data[index] = new int[10];
}

Mais les tableaux semblent bizarres pour ça. A List<T> pourrait être mieux :

private List<int[]> data = new List<int[]>();

où vous pouvez ensuite utiliser le .Add() à mesure que vous obtenez de nouveaux enregistrements, et utilisez la méthode Count propriété pour savoir combien vous en avez ajouté.

De plus, il est courant de découvrir les int[10] était en fait un substitut des champs nommés, où chaque position dans le tableau a une signification. Dans cette situation, vous êtes généralement beaucoup mieux vaut construire un class pour ces données, où chaque élément du tableau est un champ nommé dans la classe (nous l'appellerons simplement MyClass pour l'instant). Vous vous retrouvez alors avec quelque chose comme ça :

private List<MyClass> data = new List<MyClass>();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X