具有双范围情况的开关样式C#构造

Phi*_*own 3 c# double switch-statement

我正在努力想出一种在双精度上进行某种开关样式选择的最佳方法,以找出它的范围.这样的东西:

double a = 1.1;
switch(a)
{
case: (0.0, 1.6)
 return 1;
case: (1.6, 2.337)
 return 2;
case: (2.337, 3.2974)
 return 3;
default:
  return -1;
}
Run Code Online (Sandbox Code Playgroud)

显然在这个例子中,范围中的一个值必须是非包容性的,但是你得到了我的漂移.有任何想法吗?

编辑,范围不一定是整数.

编辑2:我实际上正在处理弧度并找出一个点在12个范围中的哪一个.我最终这样做:

double pi = Math.PI;
double[] zones = new double[] {
        0, pi/6, pi/3, pi/2,
        2*pi/3, 5*pi/6, pi, 7*pi/6,
        4*pi/3, 3*pi/2, 5*pi/3, 11*pi/6
    };

for (int i = 0; i < 11; i++)
{
    if (radians > zones[i] && radians <= zones[i + 1])
    {
        return i + 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

我开始做一个二元搜索类型if-else,但它会变得太乱.

Mag*_*off 7

以下内容非常适合相邻范围,因为您只需要编写一次范围限制:

double a = 1.1;

if (a < 0.0) {
    // Too low
    return -1;
} else if (a < 1.6) {
    // Range [0.0, 1.6)
    return 1;
} else if (a < 2.337) {
    // Range [1.6, 2.337)
    return 2;
} else if (a < 3.2974) {
    // Range [2.337, 3.2974)
    return 3;
} else {
    // Too high
    return -1;
}
Run Code Online (Sandbox Code Playgroud)

  • +1如果解决方案需要可扩展,可以通过将范围定义存储在数组中来修改此方法以使用二进制搜索.然后你有O(log n)而不是O(n). (2认同)