增加两个值的简单算法

时间:2011-01-24 20:23:14

标签: c# .net

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
    ..
    ..

以上代码对我来说很好;但是,我想知道是否有更好,更简洁的方式重写这个?

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)

使用正确的hashCodeequals创建一个对象,就像这样

class State{
String stack
int tray
}

制作过渡地图

Map<State,State> transitionMap = new Map...
transitionMap.put( new State( "2", 12 ), new State( "1", 2 ) )...

然后,您可以通过查找转换映射来转换状态。然后只需增加托盘。我假设您的真实代码比这更复杂,但这可能是最灵活的解决方案。

在适当的地方使用C#语法和隐喻。