使用string.Contains()和switch()

时间:2011-08-24 12:42:01

标签: c# if-statement switch-statement

我正在使用

进行C#应用
if ((message.Contains("test")))
{
   Console.WriteLine("yes");
} else if ((message.Contains("test2"))) {
   Console.WriteLine("yes for test2");
}

有没有办法更改为switch() if()语句?

12 个答案:

答案 0 :(得分:34)

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

答案 1 :(得分:26)

如果您只想使用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`... 
 }

答案 2 :(得分:18)

更正[先生]的最终语法C]的答案。

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

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

您应该处理案件订购,因为第一场比赛将被选中。这就是为什么&#34; test2&#34;在测试之前放置。

答案 3 :(得分:12)

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

例如:

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

if (!message.Contains(str)) return ;

然后

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

答案 4 :(得分:5)

这将在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/

答案 5 :(得分:2)

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

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);

答案 6 :(得分:2)

在确定环境时面对这个问题,我想出了以下一行内容:

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

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

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

答案 7 :(得分:2)

这将在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"
};

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

答案 8 :(得分: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;
    }

答案 9 :(得分:0)

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; 
}

答案 10 :(得分:0)

Stegmenn为我讨厌了它,但是当您使用IEnumerbale而不是像他的示例中的string =消息时,我有了一个改变。

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;
            }

答案 11 :(得分:-1)

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