繁体   English   中英

在 C# 中使用带有 List 的 switch case 语句

[英]Using a switch case statement with a List in c#

我在打开列表时无法让 Switch Case 语句工作

    List<int> Test = new List<int>(){9, 6, 5};
    switch(Test)
    {
        case new List<int>(){9, 6, 5}:
            Console.Write("Yes");
        break;
            
        case new List<int>(){2, 4, 8}:
            Console.Write("No");
        break;
    }

我收到错误“开关表达式或案例标签必须是布尔、字符、字符串、整数、枚举或相应的可空类型”。

switch 语句是否不适用于 List 和 Arrays 等集合类型?

C#11(在编写时仍处于预览状态)让您了解了列表模式,在您的示例中可能看起来像这样(我无法完全测试这一点,所以请谨慎对待 - @MatthewWatson 发布了一个版本没有保护套):

    List<int> Test = new List<int>(){9, 6, 5};
    switch(Test)
    {
        case var _ when Test is [9, 6, 5]:
            Console.Write("Yes");
        break;
            
        case var _ when Test is [2, 4, 8]:
            Console.Write("No");
        break;
    }

在那之前,您可以像他们在这里所做的那样使用案例保护来做到这一点,这可能看起来像这样:

    List<int> Test = new List<int>(){9, 6, 5};
    switch(Test)
    {
        // maybe implement it like some of the answers here https://stackoverflow.com/questions/876508/what-is-the-best-way-to-check-two-listt-lists-for-equality-in-c-sharp
        case var _ when Helper.AreEquivalent(Test, new List<int>(){9, 6, 5}):
            Console.Write("Yes");
        break;
            
        case var _ when Helper.AreEquivalent(Test, new List<int>(){2, 4, 8}):
            Console.Write("No");
        break;
    }

您可以使用新的 C# 11 模式匹配来解决此问题。 如果您将以下内容添加到项目文件(假设 SDK 样式的项目),您现在可以在 Visual Studio 2022(预览形式)中启用它:

<LangVersion>preview</LangVersion>

请注意,在 C# 11 发布之前预览功能可能会发生变化,因此在此之前您不能依赖此 C# 11 功能。

然后你可以像这样写一个 switch 语句:

switch (Test)
{
    case [9, 6, 5]: 
        Console.WriteLine("Yes"); 
        break;

    case [2, 4, 8]:
        Console.WriteLine("No");
        break;
}

请注意,如果您尝试返回一个值而不是调用返回 void 的方法,则可以改用 Switch 表达式,这对某些事情来说更好。

假设您要返回一个字符串:

Console.WriteLine(Test switch
{
    [9, 6, 5] => "Yes",
    [2, 4, 8] => "No",
    _         => "Other"
});

但是当然,如​​果您使用的是 switch 表达式,则必须为它提供一个默认值,以便在没有找到匹配的情况下返回。

Switch 语句仅适用于原始数据类型,即 int、string、bool 等。您可以为此使用 if else 条件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM