增加两个值的简单算法

JOE*_*EET -2 .net c#

if (stack == "1" && tray == 6)
{
    stack = "2";
    tray = 1;
}
else if (stack == "2" && tray == 12)
{
    stack = "1";
    tray = 2;
}

tray++; 
Run Code Online (Sandbox Code Playgroud)

我只需要增加堆栈,托盘这样:

    1, 1
    1, 2
    1, 3
    ...
    1, 6
    ...
  2, 1
    2, 2
    2, 3
    2, 4
    ...
    ...
2,12
    1,2
    ..
    ..
Run Code Online (Sandbox Code Playgroud)

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

pli*_*nth 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--; }
}
Run Code Online (Sandbox Code Playgroud)

请注意,您获得的值将基于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
}
Run Code Online (Sandbox Code Playgroud)

您可以使用Stack and Tray属性构建1,但我认为这违反了最不惊讶的原则.C#是一种基于0的语言,而不是基于1的语言.

  • 复杂?我不知道封装是如何复杂化的.我还考虑了封装幻数或至少使它成为一个类常量,但认为它减少了示例的可读性.我还考虑过进行任意加/减,但是通过参数检查,这也使示例变得复杂.您可能还需要注意,除了构造函数中的错误检查之外,每个操作都是1行. (4认同)
  • @JOE SKEET:怎么样?我们中的许多人会认为这比你的例子简单得多. (3认同)