枚举在C#中表现异常

use*_*608 -1 c# enums .net-4.5 visual-studio-2013

我正在编写一个学校项目(实现搜索算法),我遇到了以下问题:

有一个名为action的变量,其类型为enum Actions {esquerda = 0,abaixo = 1,direita = 2,acima = 3}.在其中一个搜索算法扩展给定状态的邻居(称为邻居的属性执行该过程)之后,它调用一个方法(Expansion()),该方法获得可能的邻居并作为列表返回.事情是在返回之后,在没有做任何事情的情况下,在调试模式下第一次读取后,可变动作的值会异常改变.

行:List temp = Expansion(); 在调用并且变量temp被填充之后,当您第二次读取临时列表的任何元素的值操作时,它将其值更改为枚举(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;
        }

}
Run Code Online (Sandbox Code Playgroud)

我知道这听起来很疯狂,我制作了一个显示这种新C#效果的视频:

http://youtu.be/gXQ6QyhMDDI

代码只是一个.cs文件,链接在这里.

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

如果有人想看看它并告诉我这里到底发生了什么,我将不胜感激.

谢谢.

方案:

我找到了通过添加名为actionName的字符串var来解决它的方法.每次我创建一个新的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;
            }

    }
Run Code Online (Sandbox Code Playgroud)

les*_*ode 5

SuccessorFunc您设置action成员变量时:

this.action = action;
Run Code Online (Sandbox Code Playgroud)

因此,当Expansion方法循环时,它将被设置为每个枚举值.