欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

C# 里的模式匹配,10個常用方法總結

admin
2024年12月12日 9:47 本文熱度 306

前言

嗨,大家好!

前兩天,我們在《使用 C# 模式匹配,告別難以維護的 if-else 語句》一文中一起探討了 C# 模式匹配在我們日常開發任務中的應用,引發了很多小伙伴的熱烈討論。

今天,我總結了模式匹配 10 個常用方法,我們繼續一起深入挖掘 C# 模式匹配的魅力,看看它如何幫助我們編寫更簡潔、更易讀且更具表現力的代碼!

一些澄清

有的小伙伴以為有了模式匹配,就可以徹底拋棄if-else 語句了。

其實不然,模式匹配本質上也是一種高級的條件判斷方式,它提供了一種更靈活的方式來進行條件判斷,特別是新的switch 表達式語法,可以更靈活地控制邏輯,簡化復雜邏輯的判斷,編寫出更具表現力和功能強大的代碼。

基本語法

1. 使用 is 關鍵字進行類型模式匹配

if (obj is string str) 

    Console.WriteLine($"String length is: {str.Length}"); 
}

2. 在 switch 語句中使用模式匹配

從 C# 8.0 開始,switch 語句被增強為switch 表達式,允許更簡潔的語法(特別是結合when 子句),并且可以直接返回值,可以替代傳統的條件語句,提高代碼的可讀性和簡潔性。

普通switch 表達式:

var time = DateTime.Now;
switch (time)
{
    case { Year: 2023 or 2024, Month: <= 12, Day: 12 } t:
        Console.WriteLine($"the first day of every month in the first half of 2020 and 2021");
        break;
}

switch 表達式中直接返回值的簡潔寫法:

string GetAnimalSound(Animal animal) => animal switch
{
    Dog => "Woof!",
    Cat => "Meow!",
    _ => "Unknown sound"
};

10 常用的使用方法

1. 類型模式

檢查一個表達式是否屬于特定類型,并且可以選擇性地將該表達式轉換為該類型。

object obj = "Hello, World!";
if (obj is string str)
{
    Console.WriteLine($"String length: {str.Length}");
}

2. 常量模式

檢查一個表達式的值是否等于某個常量,這是最簡單的模式匹配形式。

object value = 42;
switch (value)
{
    case 42:
        Console.WriteLine("The answer to life, the universe, and everything.");
        break;
    default:
        Console.WriteLine("Just another number.");
        break;
}

3. 屬性模式

允許你根據對象的屬性值進行匹配,這在處理復雜對象時非常有用

public class Person
{
    public string Name { getset; }
    public int Age { getset; }
}

Person person = new() { Name = "Alice", Age = 30 };

switch (person)
{
    case Person p when p.Age < 18:
        Console.WriteLine($"{p.Name} is a minor.");
        break;
    case Person p when p.Age >= 18 && p.Age < 65:
        Console.WriteLine($"{p.Name} is an adult.");
        break;
    case Person p when p.Age >= 65:
        Console.WriteLine($"{p.Name} is a senior citizen.");
        break;
}

4. 關系模式

使用關系運算符(如<,>)進行匹配

object value = 7;
if (value is int a && a > 6

    Console.WriteLine(a); 
}

5. 邏輯模式

使用邏輯運算符(如and,or,not)組合多個模式

object value = 7;
if (value is int a && a > 6 && a < 10

    Console.WriteLine(a); 
}

6. 元組模式

允許你對元組中的元素進行解構和匹配

var point = (x: 10, y: 20);

switch (point)
{
    case (00):
        Console.WriteLine("Origin");
        break;
    case (var x, 0):
        Console.WriteLine($"On X-axis at ({x}, 0)");
        break;
    case (0var y):
        Console.WriteLine($"On Y-axis at (0, {y})");
        break;
    case (var x, var y):
        Console.WriteLine($"Point at ({x}{y})");
        break;
}

7. 位置模式

位置模式可以對對象的屬性進行檢查和匹配

public class Person
{
    public string Name { getset; }
    public int Age { getset; }
}

void CheckPerson(Person person)
{
    switch (person)
    {
        case { Name: "Alice", Age: 30 }:
            Console.WriteLine("Found Alice, Age 30");
            break;
        default:
            // 如果有其他情況需要處理,可以在這里添加邏輯
            break;
    }
}

8. 遞歸模式

C# 8.0 引入了對更復雜對象結構的模式匹配,允許嵌套匹配。

public class Animal
{
    public string Type { getset; }
}

public class Dog : Animal
{
    public string Breed { getset; }
}

void CheckAnimal(Animal animal)
{
    switch (animal)
    {
        case Dog { Breed: "Labrador" }:
            Console.WriteLine("It's a Labrador!");
            break;
    }
}

9. 列表模式

列表模式允許將數組或列表與一系列模式進行匹配。

列表模式的語法是用方括號括起來的值。

例如:

int[] numbers = { 123 };
// 使用列表模式來匹配一個整數數組
Console.WriteLine(numbers is [123]); // True

事實上,列表模式可以使用任何模式,包括常量、類型、屬性和關系模式。

例如:

List<int> numbers = new() { 123 };

// 使用棄元模式(_)和 var 模式來匹配數組中的元素
if (numbers is [var first, _, _])
{
    Console.WriteLine($"列表中的第 1 個元素是 {first}。");
}

// 輸出:
// 列表中的第 1 個元素是 1。

10. 切片模式

切片模式允許匹配零個或多個元素的序列。

切片模式的語法是兩個點(..)。

例如,以下代碼展示了如何使用切片模式來匹配數組中的元素:

void MatchMessage(string message)
{
    var result = message is ['a' or 'A', .. var s, 'a' or 'A']
        ? $"Message {message} matches; inner part is {s}."
        : $"Message {message} doesn't match.";
    Console.WriteLine(result);
}
MatchMessage("aBBA");  // 輸出: Message aBBA matches; inner part is BB.
MatchMessage("apron");  // 輸出: Message apron doesn't match.

PS:可以利用切片模式的特點丟棄或捕獲零個或多個元素。例如:

void List_Pattern(object[] num)
{
    int a = 0;

    // 匹配數組中的前三個元素,并將第三個元素賦值給變量third
    if (num is [1intvar third, _])
    {
        Console.WriteLine("第一個為整數1");
        Console.WriteLine("第二個為整數類型");
        Console.WriteLine($"第三個為{third.ToString()}");
        Console.WriteLine("第四個隨便");
    }
}

總結

總而言之,C# 里的模式匹配功能強大且靈活,允許我們輕松地進行條件判斷和數據解構,對于更復雜的數據結構和邏輯流程,模式匹配也提供了非常強大的支持,不妨在你的項目中應用起來,相信不會讓你失望的!


該文章在 2024/12/13 9:13:49 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved