20240919 LINQ

LINQ(Language Integrated Query)是一個整合在 C# 和 .NET 中的查詢語言,讓你可以用類似 SQL 的語法來查詢不同類型的資料來源,例如集合、資料庫、XML 甚至是物件。它的主要特點是讓查詢語法與 C# 語言緊密結合,使代碼更加簡潔且易於維護。

LINQ 與 SQL、ADO.NET 的關係

技術 角色 主要用途 LINQ 的關聯
LINQ 查詢語法 用於查詢集合、物件、資料庫等多種數據來源 可與資料庫(如 SQL Server)或物件集成使用,像是查詢 SQL 資料庫時可透過 LINQ to SQL、Entity Framework。
SQL 資料庫查詢語言 查詢和操作資料庫中的資料 LINQ to SQL 是 LINQ 的一個擴展,讓你用 LINQ 語法查詢 SQL 資料庫。
ADO.NET 資料存取技術 用於與資料庫進行低層次的溝通和管理連接 LINQ 可以與 ADO.NET 結合,透過 Entity Framework 等技術來簡化資料庫查詢。

簡單來說,LINQ 可以被視為更高層次的查詢語法,讓你在操作資料時不必寫傳統的 SQL 語句或使用 ADO.NET 的繁瑣資料庫操作代碼,它將查詢直接嵌入到 C# 程式碼中,提升開發效率。

正規表示式(Regular Expression,簡稱 Regex)是一種用來匹配字串模式的工具,可以用來檢索、替換或驗證文字資料。它提供了靈活且強大的方式來處理字串操作,常用於表單驗證、文字搜索和格式化等情境。

Regex 的功能

正規表示式的核心是使用一系列特殊符號和規則來描述要匹配的字串模式。常見的符號如下:

符號 說明 範例
. 匹配任意一個字符(不包括換行符) a.c 可以匹配 "abc" 或 "axc"
* 匹配前面的字符 0 次或多次 ab*c 可以匹配 "ac"、"abc"、"abbc"
+ 匹配前面的字符 1 次或多次 ab+c 可以匹配 "abc"、"abbc"
? 匹配前面的字符 0 次或 1 次 ab?c 可以匹配 "ac" 或 "abc"
^ 匹配字串的開頭 ^a 只能匹配以 "a" 開頭的字串
$ 匹配字串的結尾 c$ 只能匹配以 "c" 結尾的字串
[] 匹配括號內的任一字符 [abc] 可以匹配 "a"、"b"、"c"
\\\\d 匹配任意一個數字(0-9) \\\\d{3} 可以匹配三個連續的數字
\\\\w 匹配任意一個字母或數字(不含特殊符號) \\\\w+ 可以匹配單詞或變量名

Regex 在 C# 中的應用

在 C# 裡,正規表示式主要透過 System.Text.RegularExpressions 命名空間中的 Regex 類來實現。以下是一個簡單的例子:

using System.Text.RegularExpressions;

string pattern = @"\\\\d{3}-\\\\d{2}-\\\\d{4}";
string input = "我的社會安全號碼是 123-45-6789";
bool isMatch = Regex.IsMatch(input, pattern);

Console.WriteLine(isMatch);  // 輸出: True

這個範例中,pattern 匹配一個類似「123-45-6789」的格式,Regex.IsMatch 用來判斷輸入的字串是否符合這個格式。

正規表示式的用途

正規表示式是一種強大但有些難掌握的工具,適合處理複雜的字串匹配需求。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace LINQ20240919
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            // 創建一個 Employee 類別的實例,並設定其 id 和 name 屬性
            Employee emp = new Employee();
            emp.id = 1;
            emp.name = "name 1";

            // 創建另一個 Employee 類別的實例,並直接初始化其 id 和 name 屬性
            Employee emp2 = new Employee() { id = 2, name = "Derek Jeter" };

            // 使用 var 關鍵字創建 Employee 類別的實例,並初始化 id 和 name 屬性
            var emp7 = new Employee() { id = 7, name = "Jeremy Lin" };

            // 以下註解掉的程式碼為另一種創建 Employee 陣列的方式
            //Employee[] empList = new Employee[3];
            //empList[0] = emp;
            //empList[1] = emp2;
            //empList[2] = emp7;

            // 使用初始化器直接創建並初始化 Employee 陣列
            Employee[] empList = new Employee[3] {
        new Employee() { id = 1, name = "Taiwan No. 1" },
        new Employee() { id = 2, name = "Derek Jeter" },
        new Employee() { id = 7, name = "Jeremy Lin" }
    };

            // 將 button1 的文本設定為 empList 陣列中第三個元素(index 2)的 name 屬性
            button1.Text = empList[2].name;
        }

        // Employee 類別的定義
        class Employee
        {
            // 私有的 id 欄位
            private int _id;

            // 公有的 id 屬性,透過 get 和 set 方法來存取私有欄位
            public int id
            {
                set
                {
                    this._id = value;
                }
                get
                {
                    return this._id;
                }
            }

            // 公有的 name 屬性,自動實作 get 和 set 方法
            public string name { get; set; }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            // 創建一個匿名類別實例,包含 id、LastName 和 country 屬性
            var emp10 = new { id = 10, LastName = "Messi", country = "A." };

            // 將 button2 的文本設定為 emp10 類別的型別名稱
            button2.Text = emp10.GetType().ToString();

            // 將表單的標題設定為 emp10 的 LastName 屬性
            this.Text = emp10.LastName;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            // 創建一個包含城市資訊的匿名類別陣列
            var cityList = new[] {
        new { cityID = "TC", cityName = "TaiChung" },
        new { cityID = "TP", cityName = "TaiPei" }
    };

            // 將 button3 的文本設定為 cityList 陣列中第二個元素(index 1)的 cityName 屬性
            button3.Text = cityList[1].cityName;
        }

    }
}