文章

第13天:Lambda 表達式

課程簡介

今天,我們將學習 Lambda 表達式,這是 C# 中簡化函數表示的一種方式。Lambda 表達式讓您可以使用簡潔的語法來定義匿名方法(沒有名稱的方法),並常用於處理集合資料。Lambda 表達式特別適合搭配 LINQ 查詢和 委派 使用,能讓代碼更加直觀和簡潔。


學習目標

  • 理解 Lambda 表達式的基本概念和語法
  • 學會如何將 Lambda 表達式應用於集合操作
  • 瞭解 Lambda 表達式在 LINQ 查詢中的應用
  • 透過練習掌握如何使用 Lambda 表達式提高程式碼效率

課程內容

1. Lambda 表達式的基本語法

Lambda 表達式的語法如下:

1
(parameters) => expression
  • parameters:輸入參數,可單一或多個。
  • =>:Lambda 運算子,表示「轉換為」。
  • expression:運算內容,通常是運算式或語句塊。

範例:

1
2
int[] numbers = { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0);

在這個範例中,n => n % 2 == 0 是 Lambda 表達式。它表示一個匿名方法,該方法接收一個 n 作為參數並返回 n % 2 == 0 的布林值,用於篩選陣列中的偶數。


2. 使用 Lambda 表達式操作集合

Lambda 表達式最常見的用途是搭配集合的 WhereSelectOrderBy 等方法操作資料。這些方法屬於 LINQ 的一部分,可以用來篩選、轉換和排序集合。

範例:

1
2
3
4
5
6
7
8
9
List<string> names = new List<string> { "Alice", "Bob", "Charlie", "David" };

// 使用 Where 來篩選名字長度大於 3 的項目
var longNames = names.Where(name => name.Length > 3);

foreach (var name in longNames)
{
    Console.WriteLine(name);  // 輸出 "Alice", "Charlie", "David"
}

在這個範例中,name => name.Length > 3 是 Lambda 表達式,返回名字長度是否大於 3。


3. Lambda 表達式與 LINQ 查詢

Lambda 表達式是 LINQ 查詢中非常強大的工具,您可以使用它快速對集合資料進行操作。以下是一些 LINQ 方法常用的 Lambda 表達式示例:

  • Select:用於轉換集合中的每個元素。

    1
    2
    3
    4
    5
    6
    7
    
    int[] numbers = { 1, 2, 3, 4, 5 };
    var squares = numbers.Select(n => n * n);
      
    foreach (var square in squares)
    {
        Console.WriteLine(square);  // 輸出 1, 4, 9, 16, 25
    }
    
  • OrderBy:用於排序集合中的元素。

    1
    2
    3
    4
    5
    6
    7
    
    List<string> fruits = new List<string> { "Apple", "Banana", "Cherry" };
    var sortedFruits = fruits.OrderBy(fruit => fruit.Length);
      
    foreach (var fruit in sortedFruits)
    {
        Console.WriteLine(fruit);  // 輸出 "Apple", "Cherry", "Banana"
    }
    
  • Any:檢查集合中是否存在符合條件的元素。

    1
    2
    3
    
    List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
    bool hasEven = numbers.Any(n => n % 2 == 0);
    Console.WriteLine(hasEven);  // 輸出 True
    

這些方法與 Lambda 表達式結合使用,能夠大幅簡化代碼,使其更具可讀性。


4. 多行 Lambda 表達式

如果 Lambda 表達式的邏輯比較複雜,您可以使用 {} 包裹多行代碼。此時需要使用 return 關鍵字來返回結果。

範例:

1
2
3
4
5
6
7
8
9
Func<int, int, int> add = (a, b) =>
{
    int result = a + b;
    Console.WriteLine("Adding " + a + " and " + b);
    return result;
};

int sum = add(3, 4);  // 輸出 "Adding 3 and 4"
Console.WriteLine(sum);  // 輸出 7

在這個範例中,Lambda 表達式內部包含了多行程式碼,並返回相加的結果。


5. 使用 Lambda 表達式作為委派

委派(Delegate)是 C# 中用來封裝方法的一種型別,您可以使用 Lambda 表達式來初始化委派。這在需要傳遞方法作為參數的情況下非常有用。

範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
public delegate int Operation(int x, int y);

class Program
{
    static void Main(string[] args)
    {
        Operation add = (x, y) => x + y;
        Operation multiply = (x, y) => x * y;

        Console.WriteLine(add(3, 4));  // 輸出 7
        Console.WriteLine(multiply(3, 4));  // 輸出 12
    }
}

在這個範例中,Operation 委派被初始化為兩個 Lambda 表達式,分別執行加法和乘法運算。


實作練習

  1. 使用 Where 篩選偶數
    • 建立一個包含多個整數的列表,並使用 Lambda 表達式篩選出偶數並顯示結果。
    1
    2
    3
    4
    5
    6
    7
    8
    
    List<int> numbers = new List<int> { 10, 15, 20, 25, 30 };
    var evenNumbers = numbers.Where(n => n % 2 == 0);
    
    Console.WriteLine("Even Numbers:");
    foreach (var num in evenNumbers)
    {
        Console.WriteLine(num);  // 輸出 10, 20, 30
    }
    
  2. 使用 Select 計算平方
    • 使用 Select 將列表中所有數字的平方值計算出來並顯示。
    1
    2
    3
    4
    5
    6
    7
    8
    
    int[] numbers = { 1, 2, 3, 4, 5 };
    var squares = numbers.Select(n => n * n);
    
    Console.WriteLine("Squares:");
    foreach (var square in squares)
    {
        Console.WriteLine(square);  // 輸出 1, 4, 9, 16, 25
    }
    
  3. 使用 Lambda 表達式作為委派
    • 定義一個委派,並使用 Lambda 表達式分別進行加法和減法運算。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    public delegate int Operation(int a, int b);
    
    class Program
    {
        static void Main(string[] args)
        {
            Operation add = (a, b) => a + b;
            Operation subtract = (a, b) => a - b;
    
            Console.WriteLine("Addition: " + add(10, 5));  // 輸出 15
            Console.WriteLine("Subtraction: " + subtract(10, 5));  // 輸出 5
        }
    }
    

教學重點

  • 了解 Lambda 表達式的語法和基本概念。
  • 學會使用 Lambda 表達式操作集合資料。
  • 掌握在 LINQ 中使用 Lambda 表達式來篩選、轉換、排序資料。
  • 使用 Lambda 表達式作為委派,提高程式碼的靈活性和簡潔性。

在下一節中,我們將深入探討 LINQ 查詢語法,並學習如何高效地查詢和操作資料集合。

本文章以 CC BY 4.0 授權