如果找到字符串,则执行switch语句

本文关键字:执行 switch 语句 字符串 如果 | 更新日期: 2023-09-27 18:27:17

下面我把我要做的事情的伪代码放在一起。我不完全确定如何用C#编写。这样的事情可能吗?如果可能的话,我该怎么做?我想做的是,如果找到返回的值,就运行一个函数。

伪代码

string list = @"
This is a multiline statement
used for testing
"
foreach (var line in list)
{
    switch (line)
    {
        case (line.Contains("multiline")):
            Console.WriteLine("has A");
            break;
        case (line.Contains("testing")):
            Console.WriteLine("has B");
            break;
    }
}

如果找到字符串,则执行switch语句

这是不可能的。使用switch语句,您只需检查给定对象的值。尝试使用if:

foreach (var line in list)
{
    if (line.Contains("multiline"))
       Console.WriteLine("has A");
    else if (line.Contains("testing"))
       Console.WriteLine("has B");     
}

来自MSDN文档:

switch语句是一个选择开关的控制语句从候选列表中执行的部分。

case语句是一个编译时常量。正确使用switch语句可以是这样的:

int caseSwitch = /* get a int value*/;
switch (caseSwitch)
{
    case 1:
        Console.WriteLine("Case 1");
        break;
    case 2:
        Console.WriteLine("Case 2");
        break;
    default:
        Console.WriteLine("Default case");
        break;
}

您尝试做的叫做"模式匹配"。C#还不支持这一点,尽管它作为下一个版本C#7的一个补充正在积极讨论中。

有第三方解决方案可以让你实现你想要做的事情。我自己的Succinc<T>例如,库将允许您将代码写为:

string list = @"
This is a multiline statement
used for testing
";
foreach (var line in list)
{
    line.Match()
        .Where(l => l.contains("multiline").Do(l => Console.WriteLine("has A"))
        .Where(l => l.contains("testing").Do(l => Console.WriteLine("has B"))
        .IgnoreElse()
        .Exec();
}

可以说,与使用一系列if相比,它可以带来更易于遵循、更具功能性的代码,尽管代价在于性能。

首先,您没有可以迭代的列表。你只是有一根绳子。你应该拆分你的字符串

string s = @"
This is a multiline statement
used for testing
";
string[] lines = s.Split(new string[] { "'r'n" }, StringSplitOptions.None);

然后case语句根据常量case值进行分支。在这种情况下不能执行条件表达式。因此,您需要使用一系列if-else语句

if (condition1) {
    ...
} else if (condition2) {
    ...
} else if (condition3) {
    ...
} else {
    ...
}