Détermination de l’élément actuellement pointé dans une liste

Je travaille avec des listes. J’ai pu déterminer la première et la dernière position des éléments de ma liste. J’utilise getPostion et affiche le nom de l’élément via une Label . Trois boutons de ma fiche: ShowFirstItem ShowNextItem (ne fonctionne pas) et ShowLastItem affichent l’élément correspondant dans une étiquette. J’ai des problèmes pour mon prochain article. Je n’ai pas un membre qui tient le fruit_tree actuel. Donc je ne suis pas sûr de savoir comment append un membre int ou un autre membre fruit_tree appelé current . Comment pourrais-je trouver le prochain (élément après le premier) et afficher le résultat?

  public class ListForTrees { public fruit_trees GetNextTree() { current = 0; fruit_trees ft = first_tree; int i = 0; while (i != current) { ft = ft.next_tree; i++; } return ft; } } ListForTrees mainlist = new ListForTrees(); private void BtnGo_Click(object sender, EventArgs e) { fruit_trees[] ar_items = { new fruit_trees("cherry", 48, 12.95, 3), new fruit_trees("pine", 36, 9.95, 8), new fruit_trees("oak", 60, 14.95, 2), new fruit_trees("peach", 54, 19.95, 3), new fruit_trees("pear", 36, 11.85, 2), new fruit_trees("apple", 62, 13.45, 5) }; mainlist = new ListForTrees(ar_items); fruit_trees current = mainlist.first_tree; while (current != null) { TxtOutput.AppendText(current.ToSsortingng() + Environment.NewLine); current = current.next_tree; } } private void ShowFirstItem_Click_1(object sender, EventArgs e) { // Show First Item labelSpecificTree.Text = mainlist.first_tree.GetTreeType; } private void ShowLastItem_Click(object sender, EventArgs e) { //Show Last Item labelSpecificTree.Text = mainlist.last_tree.GetTreeType; } private void ShowNextItem_Click(object sender, EventArgs e) { //Show Next Item fruit_trees obj = mainlist.GetNextTree(); if (obj == null) { labelSpecificTree.Text = "No more trees!"; } else { mainlist.current++; labelSpecificTree.Text = obj.next_tree.GetTreeType.ToSsortingng(); } } } 

J’appendais

 public int current; 

à la liste des arbres. dans le constructeur, mettez-le à 0;

Puis créez une méthode pour renvoyer l’object fruit_trees en cours

 public fruit_trees getCurrent() { fruit_trees ft = first_tree; int i = 0; while(i != current) { ft = ft.next_tree; i++; } return ft; } 

maintenant cette méthode retourne l’object actuel et non le suivant. Donc, vous avez 2 options dans le prochain événement de bouton.
La question est la suivante: voulez-vous passer à l’arbre suivant chaque fois que vous cliquez sur le bouton? Si tel est le cas, incrémentez la propriété actuelle, puis appelez getcurrent pour l’afficher. Si vous voulez que le courant soit retenu et ne soit pas déplacé (c.-à-d. Un clic suivant entraînera la même chose), affichez getcurrent (). Next_tree.tree_type sans incrémenter au courant.

Je ne sais pas si cela résout votre problème, mais vous pouvez append

 public fruit_trees current_tree; 

champ dans la classe ListForTrees .

Ensuite, vous pouvez facilement append une méthode montrant le pointeur d’élément suivant et en mouvement à l’élément suivant de la liste. La mémorisation de l’élément en cours vous permet d’éviter de parcourir la liste entière à chaque fois que vous souhaitez que l’arbre suivant soit sélectionné. Le code peut ressembler à ceci:

 public fruit_trees GetNextTree() { //save currently pointed tree fruit_trees tree = this.current_tree; if (tree != null) { //move current_tree to the next tree, to be returned next time current_tree = current_tree.next_tree; //return saved tree object } return tree; } 

Afin de le faire fonctionner, vous devez également vous rappeler d’initier la valeur de current_tree avec le premier arbre ajouté à la liste. Vous pouvez également écrire une sorte de méthode ResetNextTreePointer() en la renvoyant au premier arbre de la liste.

Quelques autres suggestions au code:

  • Je suppose qu’il serait préférable d’utiliser des propriétés pour les champs de vos classes, c’est-à-dire changer

     public fruit_trees first_tree; 

    dans

     private fruit_trees first_tree; public fruit_trees First_tree { get { return first_tree; } 

    comme cela désactiverait toute classe en dehors de votre classe pour modifier ces champs explicitement.

  • Ce code:

     if (count == 0) { ... } else if (count != 0) { ... } 

    peut être changé en:

     if (count == 0) { ... } else { ... }