Switch case, check ranges in C# 3.5
如果范围的间隔是固定的,可以尝试使用Switch case语句来解决问题。如上述代码所示,首先定义一个变量num,并根据num的值计算出一个范围值range。然后使用Switch case语句根据range的值来确定输出的范围。
如果范围的间隔是可变的,则需要使用if/else语句来解决问题。在这种情况下,无法使用Switch case语句来处理,因为Switch case语句要求范围的间隔是固定的。因此,我们需要使用if/else语句来根据范围的变化来确定输出的范围。
总结起来,Switch case语句适用于范围间隔固定的情况,而if/else语句适用于范围间隔可变的情况。根据具体的需求选择合适的语句来解决问题。
在C# 3.5中,当我们想要在switch语句中检查范围时,我们可能会遇到一些问题。如果我们想要检查一个较小的范围,我们可以使用多个case语句来实现,但是除此之外,我们没有其他直接的方法来实现范围检查。
一种解决方法是使用if/else语句来代替switch语句。我们可以使用if语句来检查范围,并执行相应的操作。以下是一个示例代码:
if (number >= 4 && number <= 6) { // 执行操作 } else if (number >= 7 && number <= 9) { // 执行其他操作 } else { // 执行默认操作 }
在上面的代码中,我们使用if语句来检查number的范围。如果number在4到6之间,则执行第一个操作。如果number在7到9之间,则执行第二个操作。如果number不在任何一个范围内,则执行默认操作。
另一种解决方法是使用switch语句和多个case语句来模拟范围检查。当范围较小且连续时,这种方法可能更加简洁。以下是一个示例代码:
switch (number) { case 4: case 5: case 6: // 执行操作 break; case 7: case 8: case 9: // 执行其他操作 break; default: // 执行默认操作 break; }
在上述代码中,我们使用多个case语句来检查number的范围。如果number是4、5或6,则执行第一个操作。如果number是7、8或9,则执行第二个操作。如果number不在任何一个范围内,则执行默认操作。
当在C# 3.5中需要检查范围时,我们可以使用if/else语句或switch语句来解决问题。如果范围较小且连续,可以使用多个case语句来模拟范围检查。否则,我们可以使用if语句来进行范围检查并执行相应的操作。
Switch case语句在C# 3.5中无法检查范围,这导致了下面的问题的出现。为了解决这个问题,可以使用HashTable或Dictionary来创建一个映射关系,即Condition => Action。具体实现代码如下:
class Programm { static void Main() { var myNum = 12; var cases = new Dictionary, Action> { { x => x < 3 , () => Console.WriteLine("Smaller than 3") } , { x => x < 30 , () => Console.WriteLine("Smaller than 30") } , { x => x < 300 , () => Console.WriteLine("Smaller than 300") } }; cases.First(kvp => kvp.Key(myNum)).Value(); } }
这种技术是switch语句的一种通用替代方法,尤其适用于只有一行代码(如方法调用)的情况。如果你喜欢类型别名,也可以使用类型别名来简化代码,如下所示:
using Int32Condition = System.Collections.Generic.Dictionary, System.Action>; ... var cases = new Int32Condition() { { x => x < 3 , () => Console.WriteLine("Smaller than 3") } , { x => x < 30 , () => Console.WriteLine("Smaller than 30") } , { x => x < 300 , () => Console.WriteLine("Smaller than 300") } };
然而,应该避免使用Dictionary作为数据结构,而是使用KeyValuePair、Tuple或自定义数据结构的列表,以便可以预测测试时Funcs的调用顺序。这种替代方案在实际项目中并不适用,如果我看到有人将其作为if/else的替代方案,我会将其提交到thedailywtf.com进行讨论。
此解决方案非常荒谬,不适合用于生产代码。它的性能较低,浪费内存,并且会导致过多的无法内联的函数调用。
此代码甚至无法正常工作。由于字典本质上是无序的,无法确保x < 3将在x < 30之前被检查。虽然在一两个测试用例中可能起作用,但不能保证在所有情况下都正确。除非你确保这些方法可以以任意顺序被调用(你没有做到),否则字典在这里是错误的数据结构。正如Oliver所提到的,使用元组的列表是确保顺序的一种方法,并且在语义上是正确的。注意,这与一系列if/else if语句没有本质区别。