【问题标题】:Can I use the recent c# addition 'case when' clause to use StartsWith in a switch?我可以使用最近的 c# 添加“case when”子句在 switch 中使用 StartsWith 吗?
【发布时间】:2020-03-02 09:19:18
【问题描述】:

case when 是相当新的,所以很多答案都没有涉及它。 MSDN 示例是关于强制转换对象,而不是使用原始字符串。

switch (catName)
{
    case string c when c.StartsWith("Fluffy"):
        // DoSomething
        break;
}

这似乎可行,如果您可以省略 string c 部分并改为使用 when catName 会更好。但随后多个情况不起作用:

switch (catName)
{
    case string c when c.StartsWith("Fluffy"):
    case string c when c.StartsWith("Mr"):
        // DoSomething
        break;
}

因为你不能声明两个string c。所以你可以改变第二个,但你最终会得到一个字符串 a、字符串 b、字符串 c 等的列表,这看起来不太好。

理想的方式当然是这样的:

switch (catName)
{
    case when catName.StartsWith("Fluffy"):
        ...
        break;
}

有没有一种优雅的方法来解决这个问题,还是使用if..else if 方法更好?

【问题讨论】:

  • 不,你不能那样做,其他例子是一种通过模式匹配进行的科学怪人开关。您将使用 if then else 保存更多可读字符。您可以使用 List<(Func<string, bool> func, Action action)>() 和 list.Where(x => x.func(someValue));,但更糟糕的是 IMO
  • 谢谢。我找不到涉及方法调用的全面答案。

标签: c# switch-statement


【解决方案1】:

不,你不能,因为你使用的是the pattern matching into the switch statement,并且类型是在编译时评估的:

expr 有一个编译时类型,它是类型的基类

无论如何,您可以使用相同的变量名,因为它们的作用域是本地的。 Reference

【讨论】:

    【解决方案2】:

    编辑:

    我最喜欢的解决方案是 kofifus 在 cmets 中提出的:

        string catName = "Fluffy";
        switch (catName)
        {
            case {} when catName.StartsWith("Fluffy"):
            case {} when catName.StartsWith("Mr"):
                Console.WriteLine(catName);
                break;
            default:
                Console.WriteLine("Name does not start with Mr or Fluffy.");
                break;
        }
    

    我知道你说两个不同的字符串不好,但这对我来说看起来很可读,这样做真的有问题吗:

        string catName = "Fluffy";
        switch (catName)
        {
            case string c when c.StartsWith("Fluffy"):
            case string d when d.StartsWith("Mr"):
                Console.WriteLine(catName); 
                break;  
            default:
                Console.WriteLine("Name does not start with Mr or Fluffy.");  
                break;  
        }
    

    或者,根据 Krustys 答案中的“参考”链接,您可以这样做:

        string catName = "Noodle";
        switch (catName)
        {
            case string c when (c.StartsWith("Fluffy") || c.StartsWith("Mr")):
                Console.WriteLine(catName); 
                break;  
            default:
                Console.WriteLine("Name does not begin with Mr or Fluffy.");    
                break;  
        }
    

    【讨论】:

    • 你可以用{} 代替string c 即case {} when ... catName.StartsWith(...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2023-02-18
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多