【问题标题】:Switch case, check ranges in C# 3.5 [duplicate]切换案例,检查 C# 3.5 中的范围 [重复]
【发布时间】:2012-07-05 06:54:33
【问题描述】:

在 C# 中,switch 语句不允许大小写跨越值范围。我不喜欢为此使用 if-else 循环的想法,那么还有其他方法可以检查 C# 中的数字范围吗?

【问题讨论】:

标签: c# switch-statement


【解决方案1】:

您可以使用HashTableDictionary 来创建Condition => Action 的映射。

例子:

class Programm
{
    static void Main()
    {
        var myNum = 12;

        var cases = new Dictionary<Func<int, bool>, 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.Func<System.Int32, System.Boolean>, 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") } 
    };

【讨论】:

  • 但是您不应该使用字典(使用 KeyValuePair、Tuple 或自定义的列表),否则您无法预测调用 Funcs 进行测试的顺序。
  • 有趣,但如果我在实际项目中将此模式视为 if/else 的替代品,我会将其提交给 thedailywtf.com :)
  • 这个解决方案非常荒谬。对测验有用,但对生产代码非常不利。它很慢,因为它浪费内存,并导致太多无法内联的调用。
  • 这段代码甚至不能工作。由于字典是无序的,你不能确定x &lt; 3 会在x &lt; 30 之前被检查。它在一两个测试用例中的表现并不意味着它会成立。 Dictionary 在这里只是错误的数据结构,除非您确保可以按任何顺序调用方法(您还没有这样做)。正如 Oliver 所说,元组列表将是确保排序的一种方式,并且在语义上是正确的。请注意,这与一系列 if/else if 语句实际上并没有什么不同。
【解决方案2】:

不。当然,如果范围很小,您可以使用

case 4:
case 5:
case 6:
   // blah
   break;

方法,但除此之外:没有。使用if/else

【讨论】:

    【解决方案3】:

    如果范围的间隔是恒定的,你可以试试

            int num = 11;
            int range = (num - 1) / 10; //here interval is 10
            switch (range)
            {
                case 0:
                    Console.Write("1-10");
                    break; // 1-10
                case 1:
                    Console.Write("11-20");
                    break; // 11-20
                // etc...
            }
    

    输出将是:"11-20"
    如果间隔是可变的,则使用if/else

    【讨论】:

      【解决方案4】:

      试试这样的

       private void ExecuteInRange(Dictionary<Range,Action<int>> ranges)
          {
              foreach (var range in ranges)
              {
                  if (range.Key.Value < range.Key.Max && range.Key.Value > range.Key.Max)
                      range.Value(range.Key.Value);
              }
          }
      
      
      public class Range
      {
          public int Min { get; set; }
          public int Max { get; set; }
          public int Value { get; set; }
      }
      

      【讨论】:

        【解决方案5】:

        没有。至少没有比这更美的了。

        也没有 C# 3.5 只有 .NET 3.5 和 C# 3.0

        【讨论】:

          【解决方案6】:
                  int b;
                  b = Int32.Parse(textBox1.Text);
          
                  int ans = (100-b)/3; //the 3 represents the interval
                  //100 represents the last number
          
          
                  switch(ans)
                  {
          
                     case 0:
                          MessageBox.Show("98 to 100");
                     break;
          
                     case 1:
                          MessageBox.Show("95 to 97");
                     break;
          
                     case 2:
                          MessageBox.Show("92 to 94");
                     break;
          
                     case 3:
                          MessageBox.Show("89 to 91");
                     break;
          
                     case 4:
                          MessageBox.Show("86 to 88");
                     break;
          
                     default:
                          MessageBox.Show("out of range");
                     break;
          

          【讨论】:

            【解决方案7】:

            一种嵌套简写 if-else 的东西有效,而且很干净。

            myModel.Value = modelResult >= 20 ? 5 : modelResult >= 14 ? 4 : modelResult >= 5 ? 3 : modelResult >= 2 ? 2 : modelResult == 1 ? 1 : 0;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2021-11-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多