首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C# List 依屬性分組並取每組第一筆:LINQ GroupBy 實戰

     編輯:程式設計疑難解答

情境描述

從資料庫撈回 10 筆訂單明細,每筆包含「訂單號」、「明細號」、「發票號」。明細號唯一,但訂單號可重複(如前 3 筆訂單號為 A,中 3 筆為 B,後 4 筆為 C)。業務需求:每個訂單號只取第一筆明細的發票號。

LINQ 一行解決

var firstInvoices = list
    .GroupBy(x => x.OrderNo)           // 依訂單號分組
    .Select(g => g.First().InvoiceNo); // 取每組第一筆的發票號

進階:保留完整物件

var firstDetails = list
    .GroupBy(x => x.OrderNo)
    .Select(g => g.OrderBy(x => x.DetailNo).First()); // 若需按明細號排序後取第一筆

效能與替代方案

  • 資料量小時(< 1 萬筆),LINQ 寫法最清晰、維護性最佳。
  • 資料量大時,考慮在 SQL 層面用 ROW_NUMBER() OVER (PARTITION BY OrderNo ORDER BY DetailNo) 直接過濾,減少網路傳輸與記憶體壓力。
  • 若不想用 LINQ,傳統 for 迴圈搭配 Dictionary<string, T> 也能達到 O(n) 複雜度。

總結

善用 GroupBy + First/Select 模式,能以極簡潔的程式碼解決「分組取首」類需求,是 C# 開發者必備的 LINQ 慣用語。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved