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#效果的视频:
代码只是一个.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)
在SuccessorFunc您设置action成员变量时:
this.action = action;
Run Code Online (Sandbox Code Playgroud)
因此,当Expansion方法循环时,它将被设置为每个枚举值.