我还在学习C#编程的绳索。我正在尝试编写一个求解Knight's Tour的应用程序,但在试图获得骑士未来的位置时会遇到一些悲伤。
对于我正在使用非常简单的结构的位置:
public struct Position
{
public enum BoardRank { A = 1, B, C, D, E, F, G, H };
public BoardRank X;
public int Y;
}
在骑士班中,我的PossibleMoves()
方法就是这样开始的:
public List<Position> PossibleMoves(Position position)
{
List<Position> positions = new List<Position>();
int[] multiply = new int[]{1, -1};
foreach (int times in multiply)
{
try{
Position possible = new Position();
possible.X = position.X + (Behaviour.X * times);
possible.Y = position.Y + (Behaviour.Y * times);
positions.Add(possible);
}
...
对于position = A1和times = -1,你可以看到Behaviour.X如何迅速超出范围,但我认为这将被try块拾取。
我尝试在枚举声明中添加{get; set;}
,但在VS2010中抛出了一些无用的语法错误。
还有什么我可以尝试阻止我的枚举超出界限吗?
答案 0 :(得分:8)
我以为这会被try块拾取。
不。 C#中的枚举是&#34;命名数字&#34;有效。他们不该类型的一组完整值。
还有什么我可以尝试阻止我的枚举超出界限吗?
您可以使用Enum.IsDefined
检查原始枚举中是否存在值。我个人会停止使用公共字段,而是使Position
不可变 - 然后验证构造函数中的值。您还可以使用WithX
等方法根据当前值返回一个新值,仅更改X
。虽然你有公共领域,但你永远不会相信任何特定的价值是有效的。
答案 1 :(得分:1)
使用modulo将值保持在特定范围内可能很有用:
possible.X = (position.X + (Behaviour.X * times)) % ((int)BoardRank.H + 1);
这样我不确定枚举是否是最好的解决方案,因为我们正在使用整数。数字必须是无间隙的序列,您必须确保使用最高定义的枚举值加一个。因此,如果您在枚举中添加I
,则需要更改模块。
这里有一个非常简单的程序来说明它是如何工作的:
enum Foo { A, B, C }
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine(i % ((int)Foo.C + 1));
}
}
如您所见,我们采用i
modulo C + 1
,这使得C
的整数值实际范围最大值。这是输出:
0,1,2,0,1,2,0,1,2,0