我编程学校项目(实现搜索算法)和我被困具有以下问题:枚举在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#效果视频:
的代码只是一个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;
}
}
我很欣赏这个视频的工作,但是试着将你的代码示例减少到一个最小的例子,这个问题会产生问题 – thumbmunkeys 2014-09-12 23:33:51
我只是把这些部分放在了bizzar事件发生的地方以及相应的功能上。 Beleave我,代码是那么大。 – user3430608 2014-09-12 23:37:04
代码可能更大,但您有责任以简明的方式解释它。目前,你只是将努力倾倒在其他足够善于帮助你的人身上。 – BlueTrin 2014-09-12 23:39:25