iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0
Software Development

C# 學習之路系列 第 19

[DAY18] C#基礎與實作(LINQ)

  • 分享至 

  • xImage
  •  

C# 程式基礎

LINQ(Language-Integrated Query):

LINQ是 C# 中的一個功能,它允許您使用類似 SQL 的語法來查詢、過濾和操作集合(如陣列、列表、資料庫表格等)。

LINQ 的基本概念:

LINQ 允許您使用一種統一的語法來執行各種資料操作,包括篩選、排序、投影、分組等。LINQ 適用於各種 .NET 集合,以及 Entity Framework 和其他資料來源。

LINQ 方法語法:

LINQ 也可以使用方法語法,這是一種使用擴充方法(extension methods)的方式。方法語法的主要操作包括 `Where`、`Select`、`OrderBy`、`GroupBy` 等。

Where 方法:

`Where` 方法用於篩選集合中符合特定條件的元素。
  • 程式語法:
    var filtered = collection.Where(element => condition);
    
  • 程式範例(從整數陣列中篩選出所有偶數):
    int[] numbers = { 1, 2, 3, 4, 5 };
    var evenNumbers = numbers.Where(num => num % 2 == 0);
    foreach (var num in evenNumbers)
    {
        Console.WriteLine(num); // 輸出:2, 4
    }
    

Select 方法:

`Select` 方法用於對集合中的每個元素執行投影操作,以生成新的序列。
  • 程式語法:
    var projected = collection.Select(element => projection);
    
  • 程式範例(從字串陣列中選取每個字串的長度):
    string[] names = { "Alice", "Bob", "Charlie" };
    var nameLengths = names.Select(name => name.Length);
    foreach (var num in nameLengths)
    {
        Console.WriteLine(num); // 輸出:5, 3, 7
    }
    

OrderBy 方法:

`OrderBy` 方法用於對集合中的元素進行升序排序。
  • 程式語法:
    var sorted = collection.OrderBy(element => key);
    
  • 程式範例(對整數陣列進行升序排序):
    int[] numbers = { 5, 2, 4, 1, 3 };
    var sortedNumbers = numbers.OrderBy(num => num);
    foreach (var num in sortedNumbers)
    {
        Console.WriteLine(num); // 輸出: 1, 2, 3, 4, 5
    }
    

GroupBy 方法:

`GroupBy` 方法用於根據指定的鍵值將集合中的元素分組。
  • 程式語法:
    var grouped = collection.GroupBy(element => key);
    
  • 程式範例(將一組字串按首字母分組):
    string[] names = { "Alice", "Bob", "Charlie", "David" };
    var nameGroups = names.GroupBy(name => name[0]);
    

First 和 FirstOrDefault 方法:

`First` 方法用於獲取集合中的第一個元素,而 FirstOrDefault 方法則用於獲取第一個元素,如果集合為空則返回預設值。
  • 程式語法:
    var firstElement = collection.First();
    var firstMatchingElement = collection.First(element => condition);
    var firstOrDefaultElement = collection.FirstOrDefault();
    var firstOrDefaultMatchingElement = collection.FirstOrDefault(element => condition);
    
  • 程式範例(獲取整數陣列的第一個元素,或如果陣列為空則返回預設值):
    int[] numbers = { 1, 2, 3, 4, 5 };
    var firstNumber = numbers.First();
    var firstEvenNumber = numbers.FirstOrDefault(num => num % 2 == 0);
    Console.WriteLine(firstEvenNumber); // 輸出:2
    

LINQ 查詢語法:

LINQ 查詢語法類似於 SQL 查詢語言,它由 from 子句、where 子句、select 子句等組成。查詢語法的主要組件如下:
  • from 子句:指定資料來源和範圍變數。
  • where 子句:定義篩選條件。
  • select 子句:選取要返回的元素或投影結果。

選取所有元素:

  • 程式語法:
    var query = from element in collection
                select element;
    
  • 程式範例(選取整數陣列中的所有元素):
    int[] numbers = { 1, 2, 3, 4, 5 };
    var query = from num in numbers
                select num;
    foreach (var num in query)
    {
        Console.WriteLine(num); // 輸出:1, 2, 3, 4, 5
    }
    

過濾元素:

  • 程式語法:
    var query = from element in collection
                where condition
                select element;
    
  • 程式範例(選取整數陣列中的偶數。):
    int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    
    var evenNumbers = from num in numbers
                      where num % 2 == 0
                      select num;
    
    foreach (var num in evenNumbers)
    {
        Console.WriteLine(num); // 輸出偶數:2, 4, 6, 8, 10
    }
    

排序元素:

  • 程式語法:
    var query = from element in collection
                orderby element
                select element;
    
  • 程式範例(對整數陣列進行升序排序):
    int[] numbers = { 5, 2, 4, 1, 3 };
    var query = from num in numbers
                orderby num
                select num;
    foreach (var num in query)
    {
        Console.WriteLine(num); // 輸出:1, 2, 3, 4, 5
    }
    

投影元素:

  • 程式語法:
    var query = from element in collection
                select projection;
    
  • 程式範例(從字串陣列中選取每個字串的長度):
    string[] names = { "Alice", "Bob", "Charlie" };
    var query = from name in names
                select name.Length;
    foreach (var name in query)
    {
        Console.WriteLine(name); // 輸出:5, 3, 7
    }
    

分組元素:

  • 程式語法:

    var query = from element in collection
                group element by key;
    
  • 程式範例(將一組字串按首字母分組):

    string[] names = { "Alice", "Bob", "Charlie", "David" };
    var query = from name in names
                group name by name[0];
    

使用多個條件進行過濾:

  • 程式語法:
    var query = from element in collection
                where condition1 && condition2
                select element;
    
  • 程式範例(選取整數陣列中的大於 2 且小於 5 的元素):
    int[] numbers = { 1, 2, 3, 4, 5 };
    var query = from num in numbers
                where num > 2 && num < 5
                select num;
    foreach (var name in query)
    {
        Console.WriteLine(name); // 輸出:3, 4
    }
    

LINQ 與資料庫:

LINQ 也可與 Entity Framework 或 LINQ to SQL 等資料庫技術結合使用,以執行資料庫查詢操作。這使您能夠使用 LINQ 語法查詢和操作資料庫中的資料。

程式實作練習:

  • 題目:
    有一個string List:{ "Alice", "Bob", "Charlie", "David", "Eva" },使用 LINQ 方法語法查詢一個字串列表中包含字母 "a" 的字串。

  • 程式實作:

    List<string> names = new List<string> { "Alice", "Bob", "Charlie", "David", "Eva" };
    
    var filteredNames = names.Where(name => name.Contains("a"));
    
    foreach (var name in filteredNames)
    {
        Console.WriteLine(name); // 輸出包含字母 "a" 的名字
    }
    

參考來源

  1. ChatGPT
  2. C#最強入門邁向頂尖高手之路王者歸來
  3. w3schools C#
  4. microsoft Language Integrated Query (LINQ)

期望挑戰30天持續更新成功 ~ DAY18


上一篇
[DAY17] C#基礎與實作(泛型)
下一篇
[DAY19] C#基礎與實作(MySQL資料庫)
系列文
C# 學習之路31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言