C# 關于LINQ語法和類型的使用

常用語法,具體問題具體分析

      • 1. Select
      • 2. SelectMany
      • 3. Where
      • 4. Take
      • 5. TakeWhile
      • 6. SkipWhile
      • 7. Join
      • 8. GroupJoin
      • 9. OrderBy
      • 10. OrderByDescending
      • 11. ThenBy
      • 12. Concat
      • 13. Zip
      • 14. Distinct
      • 15. Except
      • 16. Union
      • 17. Intersect
      • 18. Concat
      • 19. Reverse
      • 20. SequenceEqual
      • 21. ToLookup
      • 22. OfType
      • 23. Cast
      • 24. Range
      • 22. Repeat
      • 25. Prepend
      • 總結

1. Select

將集合中的每個元素投影(轉換)為另一種形式。

IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source,Func<TSource, TResult> selector
);
  • source: 需要投影的源集合。
  • selector: 投影邏輯(Lambda表達式)。
  • 案例
var students = new List<Student>
{new Student { Id = 1, Name = "Alice", Age = 20 },new Student { Id = 2, Name = "Bob", Age = 22 }
};// 將學生對象投影為只包含姓名和年齡的匿名類型
var namesAndAges = students.Select(s => new { s.Name, s.Age });// 輸出:
// { Name = "Alice", Age = 20 }
// { Name = "Bob", Age = 22 }

2. SelectMany

將集合中的每個元素展開為多個元素,然后合并成一個單一的集合。

IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable<TSource> source,Func<TSource, IEnumerable<TResult>> selector
);
  • 案例
var groups = new List<List<int>>
{new List<int> { 1, 2 },new List<int> { 3, 4 },new List<int> { 5, 6 }
};// 展開所有子列表為一個扁平列表
var flattened = groups.SelectMany(g => g);// 輸出:1, 2, 3, 4, 5, 6

3. Where

根據條件篩選集合中的元素,返回滿足條件的元素子集。

IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source,Func<TSource, bool> predicate
);
  • source: 需要篩選的源集合。
  • predicate: 篩選條件(Lambda表達式或委托)。
  • 案例
var students = new List<Student>
{new Student { Id = 1, Name = "Alice", Age = 20 },new Student { Id = 2, Name = "Bob", Age = 22 },new Student { Id = 3, Name = "Charlie", Age = 19 }
};// 篩選出年齡大于20歲的學生
var filtered = students.Where(s => s.Age > 20);// 輸出:Bob(Age=22)
  • 進階用法
    Where 可以結合索引或復雜條件:
// 篩選偶數位置的元素(索引從0開始)
var evenIndices = numbers.Where((n, index) => index % 2 == 0);// 多條件組合(年齡在20到25歲之間)
var filtered = students.Where(s => s.Age >= 20 && s.Age <= 25);

  • 補充說明
    Where 是 LINQ 中最基礎且常用的篩選方法,通常與其他方法(如 Select, OrderBy, Take 等)組合使用,構建復雜的查詢邏輯。例如:
var query = students.Where(s => s.Age > 20)          // 篩選條件.OrderBy(s => s.Name)            // 排序.Select(s => s.Name)             // 投影.Take(2);                        // 取前2個結果

4. Take

從集合的開頭取指定數量的元素。

IEnumerable<TSource> Take<TSource>(this IEnumerable<TSource> source,int count
);
  • 案例
var numbers = new List<int> { 1, 2, 3, 4, 5 };// 取前3個元素
var firstThree = numbers.Take(3);// 輸出:1, 2, 3

5. TakeWhile

從集合的開頭開始,取元素直到條件不滿足為止。

IEnumerable<TSource> TakeWhile<TSource>(this IEnumerable<TSource> source,Func<TSource, bool> predicate
);
  • 案例
var numbers = new List<int> { 1, 3, 5, 4, 2 };// 取元素直到遇到第一個小于當前元素的數
var taken = numbers.TakeWhile((n, index) => n > numbers[index - 1]);// 輸出:1, 3, 5(因為 4 < 5 時停止)

6. SkipWhile

跳過滿足條件的元素,直到條件不滿足為止,之后返回剩余元素。

IEnumerable<TSource> SkipWhile<TSource>(this IEnumerable<TSource> source,Func<TSource, bool> predicate
);
  • 案例
var numbers = new List<int> { 1, 3, 5, 4, 2 };// 跳過元素直到遇到第一個小于當前元素的數
var skipped = numbers.SkipWhile((n, index) => n > numbers[index - 1]);// 輸出:4, 2(從索引3開始)

7. Join

將兩個集合通過關聯鍵連接(類似SQL的INNER JOIN)。

IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer,IEnumerable<TInner> inner,Func<TOuter, TKey> outerKeySelector,Func<TInner, TKey> innerKeySelector,Func<TOuter, TInner, TResult> resultSelector
);
  • 案例
var students = new List<Student>
{new Student { Id = 1, Name = "Alice" },new Student { Id = 2, Name = "Bob" }
};var enrollments = new List<Enrollment>
{new Enrollment { StudentId = 1, Course = "Math" },new Enrollment { StudentId = 2, Course = "Physics" }
};var joined = students.Join(enrollments,s => s.Id,e => e.StudentId,(s, e) => new { s.Name, e.Course }
);// 輸出:
// { Name = "Alice", Course = "Math" }
// { Name = "Bob", Course = "Physics" }

8. GroupJoin

將兩個集合通過關聯鍵連接,并返回分組后的結果(類似SQL的LEFT JOIN)。

IEnumerable<TResult> GroupJoin<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer,IEnumerable<TInner> inner,Func<TOuter, TKey> outerKeySelector,Func<TInner, TKey> innerKeySelector,Func<TOuter, IEnumerable<TInner>, TResult> resultSelector
);
  • 案例
var students = new List<Student>
{new Student { Id = 1, Name = "Alice" },new Student { Id = 2, Name = "Bob" }
};var enrollments = new List<Enrollment>
{new Enrollment { StudentId = 1, Course = "Math" },new Enrollment { StudentId = 1, Course = "Physics" },new Enrollment { StudentId = 2, Course = "Chemistry" }
};var grouped = students.GroupJoin(enrollments,s => s.Id,e => e.StudentId,(s, es) => new { s.Name, Courses = es.Select(e => e.Course) }
);// 輸出:
// { Name = "Alice", Courses = ["Math", "Physics"] }
// { Name = "Bob", Courses = ["Chemistry"] }

9. OrderBy

按升序對集合排序。

IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source,Func<TSource, TKey> keySelector
);
  • 案例
var students = new List<Student>
{new Student { Id = 3, Name = "Charlie" },new Student { Id = 1, Name = "Alice" }
};var sorted = students.OrderBy(s => s.Id);// 輸出:按Id升序排列的列表

10. OrderByDescending

按降序對集合排序。

IOrderedEnumerable<TSource> OrderByDescending<TSource, TKey>(this IEnumerable<TSource> source,Func<TSource, TKey> keySelector
);
  • 案例
var students = new List<Student>
{new Student { Id = 3, Name = "Charlie" },new Student { Id = 1, Name = "Alice" }
};var sorted = students.OrderByDescending(s => s.Id);// 輸出:按Id降序排列的列表

11. ThenBy

在已有排序的基礎上進行二次排序。

IOrderedEnumerable<TSource> ThenBy<TSource, TKey>(this IOrderedEnumerable<TSource> source,Func<TSource, TKey> keySelector
);
  • 案例
var students = new List<Student>
{new Student { Id = 1, Name = "Alice", Age = 20 },new Student { Id = 2, Name = "Bob", Age = 20 }
};var sorted = students.OrderBy(s => s.Age).ThenBy(s => s.Name);// 先按年齡排序,再按姓名排序

12. Concat

將兩個集合連接成一個集合。

IEnumerable<TSource> Concat<TSource>(this IEnumerable<TSource> first,IEnumerable<TSource> second
);
  • 案例
var list1 = new List<int> { 1, 2 };
var list2 = new List<int> { 3, 4 };var concatenated = list1.Concat(list2);// 輸出:1, 2, 3, 4

13. Zip

將兩個集合按元素順序配對,直到較短的集合結束。

IEnumerable<TResult> Zip<TFirst, TSecond, TResult>(this IEnumerable<TFirst> first,IEnumerable<TSecond> second,Func<TFirst, TSecond, TResult> resultSelector
);
  • 案例
var list1 = new List<int> { 1, 2, 3 };
var list2 = new List<string> { "a", "b" };var zipped = list1.Zip(list2, (n, s) => $"{n}-{s}");// 輸出:["1-a", "2-b"](較短的集合決定長度)

14. Distinct

返回集合中唯一(不重復)的元素。

IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source
);
  • 案例
var numbers = new List<int> { 1, 2, 2, 3 };var distinct = numbers.Distinct();// 輸出:1, 2, 3

15. Except

返回第一個集合中存在但不在第二個集合中的元素。

IEnumerable<TSource> Except<TSource>(this IEnumerable<TSource> first,IEnumerable<TSource> second
);
  • 案例
var list1 = new List<int> { 1, 2, 3 };
var list2 = new List<int> { 2, 3, 4 };var except = list1.Except(list2);// 輸出:1(list1中有但不在list2中的元素)

以下是關于 Union, IntersectConcat 的詳細說明,補充到之前的 LINQ 方法列表中:


16. Union

返回兩個集合的并集(去重后的所有元素)。

IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first,IEnumerable<TSource> second
);
  • first: 第一個集合。
  • second: 第二個集合。
  • 案例
var list1 = new List<int> { 1, 2, 3 };
var list2 = new List<int> { 3, 4, 5 };var union = list1.Union(list2);// 輸出:1, 2, 3, 4, 5(去重后的并集)
  • 進階用法
    可自定義比較器:
var unionWithComparer = list1.Union(list2, StringComparer.OrdinalIgnoreCase);

17. Intersect

返回兩個集合的交集(同時存在于兩個集合的元素)。

IEnumerable<TSource> Intersect<TSource>(this IEnumerable<TSource> first,IEnumerable<TSource> second
);
  • 案例
var list1 = new List<int> { 1, 2, 3 };
var list2 = new List<int> { 3, 4, 5 };var intersect = list1.Intersect(list2);// 輸出:3(唯一共同元素)
  • 進階用法
    自定義比較器:
var intersectWithComparer = list1.Intersect(list2, StringComparer.OrdinalIgnoreCase);

18. Concat

將兩個集合連接成一個集合(保留重復元素,順序為 first 后接 second)。

IEnumerable<TSource> Concat<TSource>(this IEnumerable<TSource> first,IEnumerable<TSource> second
);
  • 案例
var list1 = new List<int> { 1, 2 };
var list2 = new List<int> { 2, 3 };var concatenated = list1.Concat(list2);// 輸出:1, 2, 2, 3(保留重復元素)
  • 對比總結
方法功能是否去重示例
Union并集(去重){1,2} ∪ {2,3} → {1,2,3}
Intersect交集(共同元素){1,2} ∩ {2,3} → {2}
Concat連接(保留重復,順序拼接){1,2} + {2,3} → {1,2,2,3}

19. Reverse

反轉集合的順序。

IEnumerable<TSource> Reverse<TSource>(this IEnumerable<TSource> source
);
  • 案例
var numbers = new List<int> { 1, 2, 3 };var reversed = numbers.Reverse();// 輸出:3, 2, 1

20. SequenceEqual

比較兩個集合的元素是否完全相同(順序和內容)。

bool SequenceEqual<TSource>(this IEnumerable<TSource> first,IEnumerable<TSource> second
);
  • 案例
var list1 = new List<int> { 1, 2, 3 };
var list2 = new List<int> { 1, 2, 3 };var equal = list1.SequenceEqual(list2); // truevar list3 = new List<int> { 1, 2 };
var notEqual = list1.SequenceEqual(list3); // false

21. ToLookup

將集合轉換為 ILookup<TKey, TElement>,按鍵分組。

ILookup<TKey, TElement> ToLookup<TSource, TKey, TElement>(this IEnumerable<TSource> source,Func<TSource, TKey> keySelector,Func<TSource, TElement> elementSelector
);
  • 案例
var students = new List<Student>
{new Student { Id = 1, Name = "Alice", Age = 20 },new Student { Id = 2, Name = "Bob", Age 20 }
};var lookup = students.ToLookup(s => s.Age, s => s.Name);// 查詢年齡為20的姓名列表:
var names = lookup[20]; // ["Alice", "Bob"]

22. OfType

過濾集合中符合指定類型的元素。

IEnumerable<TResult> OfType<TResult>(this IEnumerable source
);
  • 案例
var mixedList = new object[] { 1, "text", 3.14 };var numbers = mixedList.OfType<int>();// 輸出:1(只保留int類型)

23. Cast

強制轉換集合中所有元素為指定類型。

IEnumerable<TResult> Cast<TResult>(this IEnumerable source
);
  • 案例
var mixedList = new object[] { 1, "text", 3.14 };var strings = mixedList.Cast<string>(); // 拋出異常,因為包含非字符串類型

24. Range

生成一個指定范圍的整數序列。

IEnumerable<int> Range(int start,int count
);
  • 案例
var numbers = Enumerable.Range(1, 5); // 生成1到5的整數// 輸出:1, 2, 3, 4, 5

22. Repeat

生成指定次數的重復元素序列。

IEnumerable<TSource> Repeat<TSource>(TSource element,int count
);
  • 案例
var repeated = Enumerable.Repeat("Hello", 3);// 輸出:["Hello", "Hello", "Hello"]

25. Prepend

在集合的開頭添加一個元素。

IEnumerable<TSource> Prepend<TSource>(this IEnumerable<TSource> source,TSource element
);
  • 案例
var numbers = new List<int> { 2, 3 };
var prepended = numbers.Prepend(1);// 輸出:1, 2, 3

總結

  • Projection(投影): Select, SelectMany
  • Filtering(過濾): Take, TakeWhile, SkipWhile, Where
  • Joins(連接): Join, GroupJoin
  • Sorting(排序): OrderBy, OrderByDescending, ThenBy
  • Combining(結合): Concat, Zip
  • Set Operations(集合操作): Distinct, ExceptUnion?Intersect?Concat? 去重、并集、交集、差集和連接?
  • Transformation(轉換): Reverse, ToLookup, OfType, Cast, Range, Repeat, Prepend

注意:
?性能問題?:不當使用LINQ可能會導致性能下降,尤其是在處理大數據集時。建議盡早使用Where來過濾數據,減少后續操作的數據量?
?過早枚舉?:當使用foreach循環遍歷LINQ查詢結果時,如果查詢結果是一個延遲執行的序列(如IEnumerable),那么查詢會在第一次遍歷時被執行?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/85144.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/85144.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/85144.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

華為OD-2024年E卷-小明周末爬山[200分] -- python

問題描述&#xff1a; 題目描述 周末小明準備去爬山鍛煉&#xff0c;0代表平地&#xff0c;山的高度使用1到9來表示&#xff0c;小明每次爬山或下山高度只能相差k及k以內&#xff0c;每次只能上下左右一個方向上移動一格&#xff0c;小明從左上角(0,0)位置出發 輸入描述 第一行…

Android:使用OkHttp

1、權限&#xff1a; <uses-permission android:name"android.permission.INTERNET" /> implementation com.squareup.okhttp3:okhttp:3.4.1 2、GET&#xff1a; new XXXTask ().execute("http://192.168.191.128:9000/xx");private class XXXTask…

Vue3+Element Plus動態表格列寬設置

在 Vue3 Element Plus 中實現動態設置表格列寬&#xff0c;可以通過以下幾種方式實現&#xff1a; 方法 1&#xff1a;動態綁定 width 屬性&#xff08;推薦&#xff09; vue 復制 下載 <template><el-table :data"tableData" style"width: 100%…

【JVM目前使用過的參數總結】

JVM參數總結 筆記記錄 JVM-棧相關JVM-方法區(元空間)相關JVM-堆相關 JVM-棧相關 .-XX:ThreadStackSize1M -Xss1m 上面的簡寫形式【設置棧的大小】 JVM-方法區(元空間)相關 -XX:MaxMetaspaceSize10m 【設置最大元空間大小】 JVM-堆相關 -XX:MaxHeapSize10m -Xmx10m 上面的簡寫形…

AI輔助高考志愿填報-專業全景解析與報考指南

高考志愿填報&#xff0c;這可是關系到孩子未來的大事兒&#xff01;最近&#xff0c;我親戚家的孩子也面臨著這個難題&#xff0c;昨晚一個電話就跟我聊了好久&#xff0c;問我報啥專業好。說實話&#xff0c;這問題真不好回答&#xff0c;畢竟每個孩子情況不一樣&#xff0c;…

Android Studio Windows安裝與配置指南

Date: 2025-06-14 20:07:12 author: lijianzhan 內容簡介 文章中&#xff0c;主要是為了初次接觸 Android 開發的用戶提供詳細的關于 Android Studio 安裝以及配置教程&#xff0c;涵蓋環境準備、軟件下載、安裝配置全流程&#xff0c;重點解決路徑命名、組件選擇、工作空間設置…

SpringAI+DeepSeek-了解AI和大模型應用

一、認識AI 1.人工智能發展 AI&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;使機器能夠像人類一樣思考、學習和解決問題的技術。 AI發展至今大概可以分為三個階段&#xff1a; 其中&#xff0c;深度學習領域的自然語言處理(Natural Lan…

IP5362至為芯支持無線充的22.5W雙C口雙向快充移動電源方案芯片

英集芯IP5362是一款應用于移動電源&#xff0c;充電寶&#xff0c;手機&#xff0c;平板電腦等支持無線充模式的22.5W雙向快充移動電源方案SOC芯片,集成同步升降壓轉換器、鋰電池充電管理、電池電量指示等功能。兼容全部快充協議&#xff0c;同步開關放電支持最大22.5W輸出功率…

手游剛開服就被攻擊怎么辦?如何防御DDoS?

手游新上線時遭遇DDoS攻擊是常見現象&#xff0c;可能導致服務器癱瘓、玩家流失甚至項目失敗。面對突如其來的攻擊&#xff0c;開發者與運營商需要迅速響應并建立長效防御機制。本文提供應急處理步驟與防御策略&#xff0c;助力游戲穩定運營。 一、手游開服遭攻擊的應急響應 快…

秋招是開發算法一起準備,還是只準備一個

THE LAST TIME 昨天晚上半夜有個星球的26屆的同學&#xff0c;私信問我。說目前是只準備開發還是開發算法一起準備&#xff08;兩者技術知識都挺欠缺的&#xff09; 看到這里&#xff0c;肯定有很多同學會說。馬上都該秋招了&#xff0c;還什么多線程開工&#xff0c;趕緊能住編…

web項目部署配置HTTPS遇到的問題解決方法

今天使用nginxtomcatssl完成了web項目的部署&#xff0c;本以為沒有什么問題&#xff0c;但是在頁面測試的時候又蹦出了這么一個問題&#xff0c;大致是說由于配置了HTTPS&#xff0c;但是之前的請求是通過HTTP請求的&#xff0c;所以現在被攔截&#xff0c;由于缺少某些權限信…

理解與建模彈性膜-AI云計算數值分析和代碼驗證

彈性膜在連接生物學理解和工程創新方面至關重要&#xff0c;因為它們能夠模擬軟組織力學、實現先進的細胞培養系統和促進柔性設備&#xff0c;廣泛應用于軟組織生物力學、細胞培養、生物膜建模和生物醫學工程等領域。 ??AI云計算數值分析和代碼驗證 彈性膜在連接生物學理解和…

AI大模型競賽升溫:百度發布文心大模型4.5和X1

AI大模型&#xff0c;作為智能技術的巔峰之作&#xff0c;正逐步改變著我們的生活與工作方式。近期&#xff0c;百度在AI大模型領域的最新動向&#xff0c;無疑為這場科技競賽再添一把火。3月16日&#xff0c;百度正式宣布發布文心大模型4.5及文心大模型X1&#xff0c;這兩款大…

升級OpenSSL和OpenSSH 修復漏洞

升級OpenSSL和OpenSSH 目前版本OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017 升級到OpenSSH_9.8p1, OpenSSL 1.1.1u 30 May 2023 服務器CentOS Linux release 7.6.1810 (Core) 一、升級OpenSSL到1.1.1u 下載并編譯 OpenSSL&#xff08;推薦目錄 /usr/local/openssl&…

JavaSE - Object 類詳細講解

定義 是所有類的直接或者間接父類&#xff0c;是 Java 中唯一一個沒有父類的類。其中所有的方法都是可以被子類繼承的。 常用方法 equals方法&#xff1a; 比較兩個對象引用的地址值是否相同&#xff0c;默認情況下是使用 “” 進行比較&#xff0c;但是這個方法一般會被之類…

觀遠ChatBI|讓數據分析像聊天一樣簡單

BI通過收集、整合和分析企業內部的各種數據&#xff0c;幫助企業發現數據中的模式和趨勢&#xff0c;從而做出更明智的商業決策&#xff0c;以此來提升企業的經營能力和競爭力。無論是傳統BI還是自助BI&#xff0c;都是為了在數據和人之間建立一座橋梁&#xff0c;使數據能夠被…

Go語言同步原語與數據競爭:WaitGroup

在Go語言并發編程中&#xff0c;我們經常需要等待多個 goroutine 執行完畢后再繼續下一步操作。Go 提供的 sync.WaitGroup 就是專為這種**“等待一組任務完成”**而設計的同步原語。 一、基本原理 sync.WaitGroup 提供三個主要方法&#xff1a; 方法說明Add(n int)設置等待的…

Java單體架構 vs 分布式架構

Java單體架構 vs 分布式架構 在電商系統開發中&#xff0c;當用戶量從幾百激增到百萬級&#xff0c;你的架構是否還能從容應對&#xff1f;一次代碼更新是否意味著整個系統停機&#xff1f;今天我們就來拆解Java架構設計的核心命題&#xff1a;單體還是分布式&#xff1f; 一、…

day40- 硬件學習之 51單片機II (中斷處理)

一、獨立按鍵的使用 main.c key.c key.h 二、中斷處理 2.1 定義 中斷系統是為使CPU具有對外界緊急事件的實時處理能力而設置的。 當CPU正在處理某件事的時候外界發生了緊急事件請求&#xff0c;要求CPU暫停當前的工作&#xff0c;轉而去處理這個緊急事件&#xff0c;處理完以…

機器學習:開啟智能時代的大門

一、引言 機器學習&#xff08;Machine Learning&#xff09;正成為人工智能的核心技術。從 Netflix 推薦電影&#xff0c;到銀行識別欺詐交易&#xff0c;機器學習正在逐漸改變世界。本篇文章將從理論到實操全面介紹機器學習的基礎概念&#xff0c;并附有代碼和案例。 二、什…