2015-10-21 1 views
1

J'ai créé une opération d'annulation pour définir la valeur actuelle sur la valeur précédente dans une liste. Il accomplit cela en supprimant l'index le plus récent de la liste et en définissant la valeur à la valeur qui se trouve derrière. Actuellement, cela fonctionne quand il n'y a pas de valeur dans la liste à l'initialisation, ainsi que s'il y a plus d'une valeur dans la liste.L'opération d'annulation échoue lors de l'utilisation répétée

Le code fonctionne comme s'il y avait au moins un index dans le tableau, comme les tests unitaires précédents l'ont passé.

Le problème se produit lorsque j'essaie de faire passer l'exception InvalidOperationException lorsque la commande est exécutée deux fois, après que le dernier élément de la liste a également été supprimé. Donc, ajoutez (5) -> Undo() -> Undo() pour donner un exemple. Si vous remplacez également l'instruction if de valDict.Count> 0 par Value> 0, la même erreur se produit.

List<int> valDict = new List<int>(); 

public void Undo() 
    { 
     repOp1 = "Undo"; 
     Console.WriteLine("1: " + valDict.Count); 
     if (valDict.Count > 0) 
     { 
      int temp = valDict.Count - 1; 
      Console.WriteLine("2: " + temp); 
      valDict.RemoveAt(temp); 

      Console.WriteLine("3: " + valDict.Count); 
      valDict.TrimExcess(); 
      //Below Line is flagged as the error 
      Value = valDict[valDict.Count-1]; 
     } 
     else 
     { 
      throw new InvalidOperationException(); 
     } 

    } 

Quelqu'un peut regarder cela avec un regard neuf, signaler une solution possible, mais pas une mise en œuvre fixe, comme je l'ai besoin de fixer la mise en œuvre moi-même.

+4

Je suggère d'utiliser un 'Stack ' pour stocker les opérations. Vous devriez lire sur la structure de données Stack. – andrewjs

+1

Vous essayez d'indexer un élément de la liste que vous avez déjà supprimé. Kaboom quand il y avait 1 article dans la liste. Déplacez l'appel RemoveAt() vers le bas. –

+0

@Hans Ah merci, ça marche maintenant :) – IgnisSnowman

Répondre

-1

Vous pouvez contrôler que votre liste n'est pas vide avant d'avoir la valeur: list.Count == 0, ou! List.Any().