Switch case, check ranges in C# 3.5

17 浏览
0 Comments

Switch case, check ranges in C# 3.5

在C#中,switch语句不允许跨越数值范围的情况。我不喜欢使用if-else循环来实现此目的,那么在C#中有没有其他方法来检查数值范围?

0
0 Comments

如果范围的间隔是固定的,可以尝试使用Switch case语句来解决问题。如上述代码所示,首先定义一个变量num,并根据num的值计算出一个范围值range。然后使用Switch case语句根据range的值来确定输出的范围。

如果范围的间隔是可变的,则需要使用if/else语句来解决问题。在这种情况下,无法使用Switch case语句来处理,因为Switch case语句要求范围的间隔是固定的。因此,我们需要使用if/else语句来根据范围的变化来确定输出的范围。

总结起来,Switch case语句适用于范围间隔固定的情况,而if/else语句适用于范围间隔可变的情况。根据具体的需求选择合适的语句来解决问题。

0
0 Comments

在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语句来进行范围检查并执行相应的操作。

0
0 Comments

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语句没有本质区别。

0