簡體   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