使用字符串。包含()与开关()

我在做一个 C # 应用程序

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

有没有办法把 if()语句改成 switch()

176288 次浏览

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

如果你只想使用 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 str = "parameter"; // test1..test2..test3....


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

然后

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

一些自定义开关可以像这样创建。也允许多种情况下执行

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

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

正确的[ 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”放在测试之前。

在确定环境时,面对这个问题,我想出了以下一句俏皮话:

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

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

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

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;
}
switch(message)
{
case "test":
Console.WriteLine("yes");
break;
default:
if (Contains("test2")) {
Console.WriteLine("yes for test2");
}
break;
}

Stegmenn 为我标记了它,但是当您使用 IEnumable 而不是像他的示例中那样使用 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;
}
}

这将在 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://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/switch-expression

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