首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在c#中使用带有List的开关case语句

在c#中使用带有List的开关case语句
EN

Stack Overflow用户
提问于 2022-06-22 15:46:19
回答 3查看 283关注 0票数 -1

当我打开一个列表时,我很难让一个开关案例语句工作。

代码语言:javascript
复制
    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;
    }

我得到的错误“一个开关表达式或大小写标签必须是一个bool,char,字符串,积分,枚举,或相应的可空类型”。

开关语句只是不工作在集合类型,如列表和数组?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-06-22 15:57:08

C#11 (直到编写还在预览中)让您得到了列表模式的介绍,这个示例可能类似于这个示例(我不能完全测试它,所以请稍加修改- @MatthewWatson发布了一个没有案例保护的版本):

代码语言:javascript
复制
    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;
    }

在此之前,您可以像他们一样使用护箱员来执行这里,这看起来可能如下所示:

代码语言:javascript
复制
    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;
    }
票数 0
EN

Stack Overflow用户

发布于 2022-06-22 16:08:28

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

代码语言:javascript
复制
<LangVersion>preview</LangVersion>

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

然后,您可以编写如下所示的开关语句:

代码语言:javascript
复制
switch (Test)
{
    case [9, 6, 5]: 
        Console.WriteLine("Yes"); 
        break;

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

请注意,如果您试图返回一个值,而不是调用一个void返回方法,您可以使用一个开关表达式,这对于某些事情来说更好。

假设您正在返回一个字符串:

代码语言:javascript
复制
Console.WriteLine(Test switch
{
    [9, 6, 5] => "Yes",
    [2, 4, 8] => "No",
    _         => "Other"
});

但是,当然,如果使用的是开关表达式,则如果没有找到匹配的情况,则必须为其返回默认值。

票数 0
EN

Stack Overflow用户

发布于 2022-06-22 15:50:02

开关语句只适用于基本数据类型,如int、string、bool等。为此您可以使用if etc条件。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72718456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档