【问题标题】:Use string.Contains() with switch()使用 string.Contains() 和 switch()
【发布时间】:2011-11-02 18:51:06
【问题描述】:

我正在做一个我使用的 C# 应用程序

if ((message.Contains("test")))
{
   Console.WriteLine("yes");
} else if ((message.Contains("test2"))) {
   Console.WriteLine("yes for test2");
}

有什么方法可以将if() 语句更改为switch()

【问题讨论】:

    标签: c# string if-statement switch-statement contains


    【解决方案1】:

    Stegmenn 为我解决了这个问题,但是当你有一个 IEnumerable 而不是他的示例中的 string = message 时,我做了一个更改。

    private static string GetRoles(IEnumerable<External.Role> roles)
    {
        string[] switchStrings = { "Staff", "Board Member" };
        switch (switchStrings.FirstOrDefault<string>(s => roles.Select(t => t.RoleName).Contains(s)))
        {
            case "Staff":
                roleNameValues += "Staff,";
                break;
            case "Board Member":
                roleNameValues += "Director,";
                break;
            default:
                break;
        }
    }
    

    【讨论】:

      【解决方案2】:

      使用 c# 简单而高效

       string sri = "Naveen";
          switch (sri)
          {
              case var s when sri.Contains("ee"):
                 Console.WriteLine("oops! worked...");
              break;
              case var s when sri.Contains("same"):
                 Console.WriteLine("oops! Not found...");
              break;
          }
      

      【讨论】:

        【解决方案3】:

        这将在 C# 8 中使用 switch 表达式工作

        var message = "Some test message";
        
        message = message switch
        {
            string a when a.Contains("test") => "yes",
            string b when b.Contains("test2") => "yes for test2",
            _ => "nothing to say"
        };
        

        更多参考资料 https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/switch-expression

        【讨论】:

        • 我发现 switch 表达式是一种很难记住的非常奇怪的语法。如果我几个月没有使用它,总会发现自己在查找它......
        【解决方案4】:
        switch(message)
        {
          case "test":
            Console.WriteLine("yes");
            break;                
          default:
            if (Contains("test2")) {
              Console.WriteLine("yes for test2");
            }
            break;
        }
        

        【讨论】:

        • 嗨,欢迎来到堆栈溢出。要获得有用的答案,请解释为什么这是问题的答案。
        • 在 C# 中的 switch 条件不如 KOTLIN 强大,所以如果你想在 switch 的条件状态下实现 String.contains() 我认为我们必须在默认部分中分离我们的条件
        【解决方案5】:
        string message = "This is test1";
        string[] switchStrings = { "TEST1", "TEST2" };
        switch (switchStrings.FirstOrDefault<string>(s => message.ToUpper().Contains(s)))
        {
            case "TEST1":
                //Do work
                break;
            case "TEST2":
                //Do work
                break;
            default:
                //Do work
                break; 
        }
        

        【讨论】:

        • 感谢这对我来说非常有效,我有一个小改动可能会帮助其他不只是拥有字符串消息的人 private static string GetRoles(IEnumerable roles) 这是我的 switch 语句. switch (switchStrings.FirstOrDefault(s => roles.Select(t => t.RoleName).Contains(s)))
        【解决方案6】:

        在确定环境时遇到这个问题,我想出了以下单行:

        string ActiveEnvironment = localEnv.Contains("LIVE") ? "LIVE" : (localEnv.Contains("TEST") ? "TEST" : (localEnv.Contains("LOCAL") ? "LOCAL" : null));
        

        这样,如果在提供的字符串中找不到任何符合“switch”条件的内容,它就会放弃并返回null。这可以很容易地修改为返回不同的值。

        严格来说不是一个开关,更像是一个级联的 if 语句,但它很简洁而且很有效。

        【讨论】:

          【解决方案7】:

          正确的 [Mr. C]的答案。

          随着 VS2017RC 的发布及其对 C#7 的支持,它以这种方式工作:

          switch(message)
          {
              case string a when a.Contains("test2"): return "no";
              case string b when b.Contains("test"): return "yes";
          }
          

          您应该注意大小写顺序,因为将选择第一个匹配项。这就是为什么将“test2”放在测试之前的原因。

          【讨论】:

          • +1 现在完美运行。对于任何想知道在这种情况下您可以通过“x”变量访问案例值的人。
          • 另外,您可以使用任何 var 名称(除了 switch 语句中的那个)进行评估。然后,您可以在后面的代码中引用原始变量/表达式。
          • @Patrick,你能澄清一下“x”变量是什么意思吗?抱歉,我确定这很明显。
          • 问这个简单的答案我觉得很愚蠢,但是在 C# 案例语句中“break”不是强制性的吗?
          • 在case语句中,如果你使用return,你可以离开break。
          【解决方案8】:

          这将在 C# 7 中工作。在撰写本文时,它尚未发布。但是如果我理解正确,这段代码就可以工作。

          switch(message)
          {
              case Contains("test"):
                  Console.WriteLine("yes");
                  break;
              case Contains("test2"):
                  Console.WriteLine("yes for test2");
                  break;
              default:
                  Console.WriteLine("No matches found!");
          }
          

          来源:https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/

          【讨论】:

          • 不,这不起作用。 Contains does not exist in the current context.
          • 我在提供的链接上看不到您的示例。
          • 不起作用,您应该先测试它,然后再分享您的答案。请参阅Lakedaimon's solution 了解正确的语法。
          • 这非常接近。 C先生的回答是正确的。 “这将在 C# 7 中工作”虽然这个工作的语法略有偏差......查看 Lakedaimon 的答案以获得正确的语法。
          【解决方案9】:

          如果你只想使用switch/case,你可以这样做,伪代码:

              string message = "test of mine";
              string[] keys = new string[] {"test2",  "test"  };
          
              string sKeyResult = keys.FirstOrDefault<string>(s=>message.Contains(s));
          
              switch (sKeyResult)
              {
                  case "test":
                      Console.WriteLine("yes for test");
                      break;
                  case "test2":
                      Console.WriteLine("yes for test2");
                      break;
              }
          

          但是如果键的数量很大,你可以直接用字典代替,像这样:

          static Dictionary<string, string> dict = new Dictionary<string, string>();
          static void Main(string[] args)
          {
              string message = "test of mine";      
          
              // this happens only once, during initialization, this is just sample code
              dict.Add("test", "yes");
              dict.Add("test2", "yes2"); 
          
          
              string sKeyResult = dict.Keys.FirstOrDefault<string>(s=>message.Contains(s));
          
              Console.WriteLine(dict[sKeyResult]); //or `TryGetValue`... 
           }
          

          【讨论】:

          • 我从 string sKeyResult = keys.FirstOrDefault&lt;string&gt;(s=&gt;message.Contains(s)); 中删除了 &lt;string&gt; 并且仍然可以正常工作。
          【解决方案10】:

          您可以先进行检查,然后根据需要使用开关。

          例如:

          string str = "parameter"; // test1..test2..test3....
          
          if (!message.Contains(str)) return ;
          

          然后

          switch(str)
          {
            case "test1" : {} break;
            case "test2" : {} break;
            default : {} break;
          }
          

          【讨论】:

          • 我不明白这个答案。
          • 在str="test1,test2"的场景下;案例“test1”将不起作用。
          【解决方案11】:

          可以像这样创建一些自定义开关。也允许执行多个案例

          public class ContainsSwitch
          {
          
              List<ContainsSwitch> actionList = new List<ContainsSwitch>();
              public string Value { get; set; }
              public Action Action { get; set; }
              public bool SingleCaseExecution { get; set; }
              public void Perform( string target)
              {
                  foreach (ContainsSwitch act in actionList)
                  {
                      if (target.Contains(act.Value))
                      {
                          act.Action();
                          if(SingleCaseExecution)
                              break;
                      }
                  }
              }
              public void AddCase(string value, Action act)
              {
                  actionList.Add(new ContainsSwitch() { Action = act, Value = value });
              }
          }
          

          这样打电话

          string m = "abc";
          ContainsSwitch switchAction = new ContainsSwitch();
          switchAction.SingleCaseExecution = true;
          switchAction.AddCase("a", delegate() { Console.WriteLine("matched a"); });
          switchAction.AddCase("d", delegate() { Console.WriteLine("matched d"); });
          switchAction.AddCase("a", delegate() { Console.WriteLine("matched a"); });
          
          switchAction.Perform(m);
          

          【讨论】:

            【解决方案12】:

            不,switch 语句需要编译时常量。语句 message.Contains("test") 可以根据消息评估 true 或 false,因此它不是常量,因此不能用作 switch 语句的“案例”。

            【讨论】:

            • 所以我只能使用if()?这很混乱:(
            • @zad0xsis:你有很多这些吗?如果是这样,您可能会稍微抽象一下这个想法......
            • 是的,我有很多 if() :(
            • 值得注意的是 - 这将随着 C# 7 的变化而改变。模式可用于 case 子句。在撰写本文时,此功能在 Visual Studio 15 Preview 4 中可用。blogs.msdn.microsoft.com/dotnet/2016/08/24/…
            猜你喜欢
            • 1970-01-01
            • 2016-01-02
            • 1970-01-01
            • 2013-11-16
            • 2021-10-11
            • 2021-09-18
            • 2023-03-14
            • 1970-01-01
            • 2013-10-20
            相关资源
            最近更新 更多