【问题标题】:switch case on integer with priority [duplicate]在具有优先级的整数上切换大小写[重复]
【发布时间】:2015-04-21 17:22:34
【问题描述】:

在这里筋疲力尽的菜鸟。我基本上有两个问题...

抱歉,开关位于一个循环中,该循环获取一堆数字,然后使用 OrderByDescending() 对它们进行排序。我的问题是现在我不知道有哪些数字,我只知道它们是按降序排列的。现在我优先考虑数字,某些特定数字对我来说比其他数字更重要(这背后没有规则或逻辑)。但另一方面,我正在寻找的数字都不可能在里面,因此作为“默认”返回或使用集合内的最高数字。

1:switch-cases 的顺序是否敏感? 假设我打开 1 到 5 的范围,并且对我来说 4 的优先级高于其他优先级,那会按预期工作吗?

switch(number)
{
case 4: DoFancyStuff(); break;
case 3: NotTooFancy(); break;
case 1: StillOk(); break;
case 2: Bad(); break;
case 5: SuperBad(); break;
default:break;
}

无论如何,让我们进一步假设数字是按降序排列的。但我现在不知道number 的可能范围,可能是 2、4、8、16 等,但可能缺少一个数字:2、4、16、...

如果我不得不说

switch(number)
{
case 32: Nice(); break;
case 64: OkToo(); break;
case 128: Nah(); break;
case 8: OkStillTakeIt(); break;
default: break;
}

因此,由于数字是按降序排列的,大的排在第一位,但它们没有最高优先级,因此可能会有一个具有最高(优先级)的数字(第一种情况)出现,但也不必如此。 ..如果没有合适的,我想拿最高的,但那是“丢失”。

我该如何解决这个问题?还是我只是想多了?方法错误?想了想我的脑袋都快炸了。

【问题讨论】:

  • 你为什么不先尝试一下,然后你应该有你的答案。
  • 是的,在我添加我的澄清后,否决票会被删除,这让我的问题更有意义......?
  • 虽然我已经写了一个顶级问题的答案,但你涵盖了很多领域。我建议您回去重新思考您的方法,并编写一个新问题,明确定义您要达到的目标以及您的方法如何使您失败。
  • 我认为重复涵盖了您正在寻找的很多信息,特别是在this 答案中。请注意,在大多数实际情况(有几个选择)中,您不太可能看到任何差异,并且该问题的答案很好地涵盖了该部分。

标签: c#


【解决方案1】:

switch 中的所有情况都必须互斥,因此实际上没有优先级的概念。不可能有 2 个案例符合条件。

有关详细信息,请参阅switch (C# Reference)

【讨论】:

  • 是的,一个数要么是1要么是2,没有一个数同时是1和2。
  • 是的,当然对不起。我忘了添加一个 for 循环中的开关,该循环遍历一组数字等
【解决方案2】:

switch 语句中的顺序完全不相关。将它们想象成if 语句,但它们都是不能重叠的排他性案例。没有一个数可以同时是1 2,所以如果1进入switch语句,无论在哪里,都会一直到case 1,不用管任何其他情况。

为了维护起见,我建议你把它们整理好,这样你的箱子很容易找到。

【讨论】:

    【解决方案3】:

    不回答:OP 不是在寻找范围检查。不要删除以阻止其他人回答相同的问题。


    听起来您希望 switch 检查值的范围 - 它没有,它只允许检查特定值。

    如果您需要检查范围 - 多个 if 检查是不错的选择:

    if (value < 10) {...} // 0-9
    else if (value < 100) {...} //10-99
    else {...} // 100+
    

    对于更多范围 - 范围的排序列表和二进制搜索可能是更好的选择

    【讨论】:

    • 不,我不知道。抱歉,我添加了更多信息作为说明。我忘了提到数字的循环和集合
    【解决方案4】:

    优先级在 switch 语句中不是一个重要的概念。简短的回答是,代码将从上到下运行,依次检查每种情况下的值,直到找到一个,或者命中默认值。

    话虽如此,当您谈论特定值的频率时,顺序通常非常重要。如果您从设计中知道某个 case 将比其他数字更频繁,那么您将这个数字作为第一个 case 放在 switch 语句中以最小化检查次数是有意义的。

    对于某些场景,编译器可以optimize the switch statement 进入一个称为跳转表的恒定时间分支,在这种情况下,这些案例的顺序无关紧要。

    【讨论】:

    • 开关不一定会将输入值与每个 case 值进行比较。通常(至少对于整数类型),开关会转换成一个或多个(开关操作码)[msdn.microsoft.com/en-us/library/…,这是一个跳转表。
    • 你的链接不起作用,但是,我是在概念上讲,不一定是关于底层实现
    • Here's a fixed link 此外,您在谈论频率时关于顺序很重要的建议取决于底层实现。跳转表可以在一段时间内大致独立于表中的项目数(在合理范围内)。该建议不一定正确。
    • 你说的有道理,我会为后人调整答案。一般来说,我不会考虑到这一点,因为编译器是否选择实现跳转表不会使执行变得更糟,而且在许多情况下编译器不会生成跳转表作为优化。
    猜你喜欢
    • 2016-06-09
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多