使用 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 roles) 这是我的 switch 语句. switch (switchStrings.FirstOrDefault(s => roles.Select(t => t.RoleName).Contains(s)))【参考方案6】:

在确定环境时遇到这个问题,我想出了以下单行:

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&lt;string&gt;(s=&gt;message.Contains(s)); 中删除了 &lt;string&gt; 并且仍然可以正常工作。【参考方案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.contains和string.replace在一行代码中

Java 中 String.contains() 的大 O 是啥?

使用javascript实现C#的String.contains()

python、pandas中string.contains的反转