2014-09-12 55 views
-1

我编程学校项目(实现搜索算法)和我被困具有以下问题:枚举在C#中的异常行为

有一个叫动作变量,它的类型是枚举操作{的Esquerda = 0, abaixo = 1,direita = 2,acima = 3}。在其中一个搜索算法展开给定状态的邻居(Property称为Neighbors进程)之后,它调用一个方法(Expansion()),该方法获取可能的邻居并将其作为列表返回。返回之后,在调试模式下第一次读取后,没有任何操作,变量操作的值异常改变。

该行:List temp = Expansion(); 在调用并且变量temp被填充后,当您第二次读取temp列表的任何元素的值时,它将其值更改为enum(acima)的最后一项。

public class PuzzleState : Search.Node 
    { 
     private States[,] actualState; 

     private int empLinePos; 
     private int empColumPos; 

     private int dimension; 

     private Actions action; 

     private PuzzleState father; 
     private List<PuzzleState> children = new List<PuzzleState>(); 

     public IEnumerable<Search.Node> Neighbours 
     { 
      get 
      { 
       List<PuzzleState> temp = Expansion(); 
      // List<Search.Node> converted = Convert(temp); 
       return null; 
      } 
     } 

    public PuzzleState(int dimension, States[,] iniStates, Actions lastAction, PuzzleState father) 
    { 
     actualState = new States[dimension, dimension]; 
     actualState = iniStates; 

     this.action = lastAction; 
     this.dimension = dimension; 

     this.father = father; 

     for (int i = 0; i < dimension; i++) 
     { 
      for (int j = 0; j < dimension; j++) 
      { 
       if (actualState[i, j] == States.Empty) 
       { 
        empLinePos = i; 
        empColumPos = j; 
        return; 
       } 
      } 
     } 
    } 

    public List<PuzzleState> Expansion() 
     { 
      List<PuzzleState> suns = new List<PuzzleState>(); 

      foreach (Actions item in System.Enum.GetValues(typeof(Actions))) 
      { 
       PuzzleState temp = SucessorFunc(item); 
       if (temp != null) 
       { 
        suns.Add(temp); 
       } 
      } 

      return suns; 
     } 
     public PuzzleState SucessorFunc(Actions action) 
     { 
      this.action = action; 
      switch (action) 
      { 
       case Actions.esquerda: 

        if (empColumPos > 0) 
        { 
         States[,] newPossibilities = Copy(); 

         newPossibilities[empLinePos, empColumPos] = newPossibilities[empLinePos, empColumPos - 1]; 
         newPossibilities[empLinePos, empColumPos - 1] = States.Empty; 

         return new PuzzleState(dimension, newPossibilities, action, this); 
        } 
        break; 
       case Actions.direita: 

        if (empColumPos < dimension - 1) 
        { 
         States[,] newPossibilities = Copy(); 

         newPossibilities[empLinePos, empColumPos] = newPossibilities[empLinePos, empColumPos + 1]; 
         newPossibilities[empLinePos, empColumPos + 1] = States.Empty; 

         return new PuzzleState(dimension, newPossibilities, action, this); 
        } 
        break; 
       case Actions.acima: 

        if (empLinePos > 0) 
        { 
         States[,] newPossibilities = Copy(); 

         newPossibilities[empLinePos, empColumPos] = newPossibilities[empLinePos - 1, empColumPos]; 
         newPossibilities[empLinePos - 1, empColumPos] = States.Empty; 

         return new PuzzleState(dimension, newPossibilities, action, this); 
        } 
        break; 
       case Actions.abaixo: 

        if (empLinePos < dimension - 1) 
        { 
         States[,] newPossibilities = Copy(); 

         newPossibilities[empLinePos, empColumPos] = newPossibilities[empLinePos + 1, empColumPos]; 
         newPossibilities[empLinePos + 1, empColumPos] = States.Empty; 

         return new PuzzleState(dimension, newPossibilities, action, this); 
        } 
        break; 
      } 

      return null; 
     } 

} 

当我知道这听起来很疯狂,我做了展示这种新的C#效果视频:

http://youtu.be/gXQ6QyhMDDI

的代码只是一个cs文件和链接在这里。

https://www.dropbox.com/sh/gc80ld47eps08nr/AAA3v-t-Jcv_-5CeDzxriLKua?dl=0

如果有人想检查出来,并告诉我这到底是怎么回事,我将不胜感激。

谢谢。

解决方案:

我发现我的方式,加入了一个名为actionName串变种它绕过去。每次我创建一个新的PuzzleState时,我将它的值设置为action.tostring()。但是我仍然不知道为什么动作值连续改变最后一项枚举值。

与actionName变量及其在构造函​​数中设置新密码:

public class PuzzleState : Search.Node 
     { 
      private States[,] actualState; 

      private int empLinePos; 
      private int empColumPos; 

      private int dimension; 

      private Actions action; 
      private string actionName; 

      private PuzzleState father; 
      private List<PuzzleState> children = new List<PuzzleState>(); 

      public IEnumerable<Search.Node> Neighbours 
      { 
       get 
       { 
        List<PuzzleState> temp = Expansion(); 
       // List<Search.Node> converted = Convert(temp); 
        return null; 
       } 
      } 

     public PuzzleState(int dimension, States[,] iniStates, Actions lastAction, PuzzleState father) 
     { 
      actualState = new States[dimension, dimension]; 
      actualState = iniStates; 
      this.actionName = lastAction.ToString(); 


      this.action = lastAction; 
      this.dimension = dimension; 

      this.father = father; 

      for (int i = 0; i < dimension; i++) 
      { 
       for (int j = 0; j < dimension; j++) 
       { 
        if (actualState[i, j] == States.Empty) 
        { 
         empLinePos = i; 
         empColumPos = j; 
         return; 
        } 
       } 
      } 
     } 

     public List<PuzzleState> Expansion() 
      { 
       List<PuzzleState> suns = new List<PuzzleState>(); 

       foreach (Actions item in System.Enum.GetValues(typeof(Actions))) 
       { 
        PuzzleState temp = SucessorFunc(item); 
        if (temp != null) 
        { 
         suns.Add(temp); 
        } 
       } 

       return suns; 
      } 
      public PuzzleState SucessorFunc(Actions action) 
      { 
       this.action = action; 
       switch (action) 
       { 
        case Actions.esquerda: 

         if (empColumPos > 0) 
         { 
          States[,] newPossibilities = Copy(); 

          newPossibilities[empLinePos, empColumPos] = newPossibilities[empLinePos, empColumPos - 1]; 
          newPossibilities[empLinePos, empColumPos - 1] = States.Empty; 

          return new PuzzleState(dimension, newPossibilities, action, this); 
         } 
         break; 
        case Actions.direita: 

         if (empColumPos < dimension - 1) 
         { 
          States[,] newPossibilities = Copy(); 

          newPossibilities[empLinePos, empColumPos] = newPossibilities[empLinePos, empColumPos + 1]; 
          newPossibilities[empLinePos, empColumPos + 1] = States.Empty; 

          return new PuzzleState(dimension, newPossibilities, action, this); 
         } 
         break; 
        case Actions.acima: 

         if (empLinePos > 0) 
         { 
          States[,] newPossibilities = Copy(); 

          newPossibilities[empLinePos, empColumPos] = newPossibilities[empLinePos - 1, empColumPos]; 
          newPossibilities[empLinePos - 1, empColumPos] = States.Empty; 

          return new PuzzleState(dimension, newPossibilities, action, this); 
         } 
         break; 
        case Actions.abaixo: 

         if (empLinePos < dimension - 1) 
         { 
          States[,] newPossibilities = Copy(); 

          newPossibilities[empLinePos, empColumPos] = newPossibilities[empLinePos + 1, empColumPos]; 
          newPossibilities[empLinePos + 1, empColumPos] = States.Empty; 

          return new PuzzleState(dimension, newPossibilities, action, this); 
         } 
         break; 
       } 

       return null; 
      } 

    } 
+2

我很欣赏这个视频的工作,但是试着将你的代码示例减少到一个最小的例子,这个问题会产生问题 – thumbmunkeys 2014-09-12 23:33:51

+0

我只是把这些部分放在了bizzar事件发生的地方以及相应的功能上。 Beleave我,代码是那么大。 – user3430608 2014-09-12 23:37:04

+2

代码可能更大,但您有责任以简明的方式解释它。目前,你只是将努力倾倒在其他足够善于帮助你的人身上。 – BlueTrin 2014-09-12 23:39:25

回答

5

SuccessorFunc你设置action成员变量:

this.action = action; 

所以将设置到每个的枚举值作为您的Expansion方法循环。

+0

谢谢你的工作! – user3430608 2014-09-12 23:40:07

+0

我永远不会想到这是问题.. – user3430608 2014-09-12 23:43:38