首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

LINQ 投影、篩選與排序:Select、SelectMany、Distinct、分頁、OrderBy

     編輯:關於C#

Select:投影與轉型

Select 子句決定輸出形狀:可返回原對象、屬性、新對象、匿名類型、方法調用結果。

// 只取姓名
var names = from s in students where s.Name.Length > 3 select s.Name;

// 返回原對象
var filtered = from s in students where s.Name.Length > 3 select s;

// 新建實體對象
var dtos = from s in students where s.Name.Length > 3 
           select new Student { Id = s.Id, Name = s.Name };

// 匿名類型 (最常用)
var anon = from s in students where s.Name.Length > 3
           select new { s.Id, s.Name };

// 對結果調用方法
var strings = from s in students select s.ToString();

SelectMany:扁平化嵌套序列

當元素本身是集合時,SelectMany 將多個子序列合併為一個平坦序列。

// 字串實現 IEnumerable<char>,可扁平化為字符序列
var allChars = students.SelectMany(s => s.Name); 
// 等價查詢語法
var allChars = from s in students from ch in s.Name select ch;

// 實際場景:訂單-明細扁平化
var allItems = orders.SelectMany(o => o.Details);

Distinct:去重

僅支援方法語法,需元素實現相等比較 (值類型自動、引用類型需覆寫 Equals/GetHashCode 或提供 IEqualityComparer)。

var uniqueChars = students.SelectMany(s => s.Name).Distinct();

分頁與單元素操作

方法用途示例
First()第一個元素,無則拋異常students.First()
FirstOrDefault()第一個元素,無則默認值students.FirstOrDefault()
Last()最後一個元素students.Last()
Single()唯一元素,多於一個拋異常list.Single()
Skip(n)跳過前 n 個students.Skip(2)
Take(n)取前 n 個students.Skip(2).Take(1)

OrderBy / OrderByDescending:排序

Key 必須實現 IComparable。支援多級排序:ThenBy、ThenByDescending。

// 單級降序
var sorted = from s in students orderby s.Name descending select s.Name;
// Dark, Cindy, Bill, Andy

// 多級:先按姓名長度升序,同長度再按名字降序
var multi = students
    .OrderBy(s => s.Name.Length)
    .ThenByDescending(s => s.Name);

查詢語法 vs 方法語法對照

// 查詢語法
var q = from s in students
        where s.Name.Length > 3
        orderby s.Name descending
        select new { s.Id, s.Name };

// 方法語法 (編譯器實際生成的形式)
var m = students
    .Where(s => s.Name.Length > 3)
    .OrderByDescending(s => s.Name)
    .Select(s => new { s.Id, s.Name });

IOrderedEnumerable:排序後的特殊類型

OrderBy 返回 IOrderedEnumerable<T>,才能鏈式調用 ThenBy。直接 Select 後失去排序能力。

效能提示

  • Where 放在 OrderBy 前:先篩選再排序,減少排序元素數
  • 大數據分頁:Skip/Take 在 LINQ to Objects 仍需遍歷前 N 個,考慮數據庫端分頁
  • 匿名類型投影比 new 實體類省記憶體且不可變,適合只讀場景

Select/Where/OrderBy 是 LINQ 三大核心算子,組合起來能表達絕大多數查詢需求。

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