使用string.Contains()和switch()

pme*_*ino 30 c# if-statement switch-statement

我正在使用C#应用程序

if ((message.Contains("test")))
{
   Console.WriteLine("yes");
} else if ((message.Contains("test2"))) {
   Console.WriteLine("yes for test2");
}
Run Code Online (Sandbox Code Playgroud)

有什么办法可以改变switch()这些if()陈述吗?

Teo*_*gul 35

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

  • 值得注意的是 - 这将随着C#7而改变.模式可以用在case子句中.在撰写本文时,Visual Studio 15 Preview 4中提供了此功能.https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/ (7认同)
  • 所以我只能使用`if()`?真是乱七八糟:( (2认同)

Lak*_*mon 30

纠正[先生]的最终语法 C]的答案.

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

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

您应该选择案例订购,因为第一场比赛将被选中.这就是为什么在测试之前放置"test2"的原因.

  • 在 case 语句中,如果使用 return,则可以保留中断。 (2认同)

Tig*_*ran 29

如果你只是想使用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;
    }
Run Code Online (Sandbox Code Playgroud)

但是如果键的数量很大,你可以用字典替换它,如下所示:

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`... 
 }
Run Code Online (Sandbox Code Playgroud)


she*_*bin 12

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

例如:

string str = "parameter"; // test1..test2..test3....

if (!message.Contains(str)) return ;
Run Code Online (Sandbox Code Playgroud)

然后

switch(str)
{
  case "test1" : {} break;
  case "test2" : {} break;
  default : {} break;
}
Run Code Online (Sandbox Code Playgroud)

  • 我不明白这个答案。 (37认同)
  • 这个答案不是正确的。 (2认同)

小智 11

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

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"
};
Run Code Online (Sandbox Code Playgroud)

如需进一步参考 https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/switch-expression

  • 我发现 switch 表达式是一种非常奇怪的语法,很难记住。如果我几个月没有使用它,我总是会发现自己在查找它...... (6认同)

Naw*_*win 10

使用 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;
    }
Run Code Online (Sandbox Code Playgroud)

  • 如果您不需要 var s 的值(正如您在示例中不需要的那样),您可以使用 var _ 来丢弃它。 (5认同)

小智 7

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; 
}
Run Code Online (Sandbox Code Playgroud)