使用 string.Contains() 和 switch()
Posted
技术标签:
【中文标题】使用 string.Contains() 和 switch()【英文标题】:Use string.Contains() with 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()
?
【问题讨论】:
【参考方案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在确定环境时遇到这个问题,我想出了以下单行:
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<string>(s=>message.Contains(s));
中删除了 <string>
并且仍然可以正常工作。【参考方案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/…以上是关于使用 string.Contains() 和 switch()的主要内容,如果未能解决你的问题,请参考以下文章
C# (String.StartsWith && !String.EndsWith && !String.Contains) 使用列表
string.contains和string.replace在一行代码中
Java 中 String.contains() 的大 O 是啥?