if (stack == "1" && tray == 6)
{
stack = "2";
tray = 1;
}
else if (stack == "2" && tray == 12)
{
stack = "1";
tray = 2;
}
tray++;
我只需要增加堆叠,托盘这样:
1, 1
1, 2
1, 3
...
1, 6
...
2, 1
2, 2
2, 3
2, 4
...
...
2,12
1,2
..
..
以上代码对我来说很好;但是,我想知道是否有更好,更简洁的方式重写这个?
答案 0 :(得分:5)
在我的头顶,似乎你要做的是组合一个基数6和一个基数10。你应该能够把它想象成一个乘数为6的固定点数。
public class StackTray {
int _stackTray;
public StackTray() : this(0, 0) { }
public StackTray(int stack, int tray)
{
if (stack < 0) throw new ArgumentOutOfRangeException("stack");
if (tray < 0 || tray >= 6) throw new ArgumentOutOfRangeException("tray");
_stackTray = stack * 6 + tray;
}
public int Stack { get { return _stackTray / 6; } }
public int Tray { get { return _stackTray % 6; } }
public void Increment() { _stackTray++; }
public void Decrement() { if( _stackTray == 0) return; _stackTray--; }
}
请注意,您获得的值将基于0,而不是基于示例中的1。
使用中:
StackTray st = new StackTray();
for (int i=0; i < 10; i++) {
st.Increment();
Console.WriteLine("Stack: {0} Tray: {1}", st.Stack + 1, st.Tray + 1); // tada - one based
}
for (int i=0; i < 5; i++) {
st.Decrement();
Console.WriteLine("Stack: {0} Tray: {1}", st.Stack, st.Tray); // tada - zero based
}
你可以在Stack and Tray属性中构建1,但我认为这违反了最不惊讶的原则。 C#是一种基于0的语言,而不是基于1的语言。
答案 1 :(得分:0)
使用正确的hashCode
和equals
创建一个对象,就像这样
class State{
String stack
int tray
}
制作过渡地图
Map<State,State> transitionMap = new Map...
transitionMap.put( new State( "2", 12 ), new State( "1", 2 ) )...
然后,您可以通过查找转换映射来转换状态。然后只需增加托盘。我假设您的真实代码比这更复杂,但这可能是最灵活的解决方案。
在适当的地方使用C#语法和隐喻。