Linq常用查詢運算符

来源:http://www.cnblogs.com/powerdk/archive/2016/01/01/5093455.html
-Advertisement-
Play Games

Linq一共包含五十幾個查詢運算符,常用的根據類型來區分一共有5類左右,這五類裡面一些事在項目查詢中經常用到的。不過linq運算符的命名十分規範,基本從字面意思就能猜測出來是幹嘛用的,下麵我們挑選一些常用的來介紹一下。根據分類我們能分成下麵4種類型:1.返回IEnumerable類型的 1.1...


  Linq一共包含五十幾個查詢運算符,常用的根據類型來區分一共有5類左右,這五類裡面一些事在項目查詢中經常用到的。不過linq運算符的命名十分規範,基本從字面意思就能猜測出來是幹嘛用的,下麵我們挑選一些常用的來介紹一下。根據分類我們能分成下麵4種類型:

 

1.返回IEnumerable<T>類型的

  1.1  Where:主要用於對於序列的篩選,跟在sql中對數據篩選用法是一樣的

1 int[] array = { 1, 3, 5, 7, 2 };
2 var query = array.Where(p => p >= 2); //輸出 3,5,7,2

 

  1.2  OfType:這個也用於篩選數據,跟where不同之處在於是對某一類型的數據篩選,根據指定類型對IEnumerable元素的篩選

1 List<object> list = new List<object>();
2 list.Add("Power");
3 list.Add(1);
4 list.Add(DateTime.Now);  
5 var query = list.OfType<string>().Where(p => p.StartsWith("P")); //輸出   Power 

 

  1.3  Cast:定義在IEnumerable上,用於將非泛型的序列轉成泛型序列,當轉換不成功的時候,則會拋出異常

1 ArrayList al = new ArrayList(); 
2 al.Add(100); 
3 al.Add(200);
4 al.Add("df"); //拋出System.InvalidCastException異常

 

  1.4  OrderBy,ThenBy,OrderByDescending,ThenByDescending:這幾個就是排序,排序,排序。唯一要註意的事情是ThenBy是在IOrderedEnumerable<T>上面定義的拓展方法,因為不能直接在IEnumerable<T>上調用,ThenBy的調用只能排在OrderBy之後

1 List<Product> list2 = new List<Product>();
2 list2.Add(new Product() {Index = 1,value = 2});
3 list2.Add(new Product() { Index = 12 value = 22 });
4 list2.OrderBy(p => p.Index).ThenBy(p => p.value);

 

  1.5  Select:實現了投影操作,可以在其內對對象類型進行轉換。例如在select出來的對象中,將其轉換成我們所需要的類型

1 list2.Select(p=>new Product {Index = p.Index});//新建了一個product對象

  

  1.6  Take,Skip:skip是跳過幾個元素,take是取幾個元素,這兩個東西用於分頁,例如我們想跳過前面十行的數據,取後面十行的數據

1 var q = list.Skip(10).Take(10);

  

  1.7  TakeWhile(),SkipWhile():    

    TakeWhile在遇到不符合條件的元素的時候返回前面找到符合條件的元素

1 int[] arr = {1, 4, 8, 2, 3,1};
2 var query1 = arr.TakeWhile(x => x <= 3); //輸出 1 

    SkipWhile會一直跳過符合條件的元素,直到遇到第一個不符合條件的元素,然後取該元素後面的所有元素

1 var query2 = arr.SkipWhile(x => x <= 3);//輸出  4  8 2 3 1

  

  1.8  Reverse()用於將序列中的元素逆序排列

 

  1.9  DefaultIfEmpty()當序列為空的時候,DefaultIfEmpty會添加一個預設值或者指定值,這個在做left join或right join中比較好用,當為空值的時候,我們可以指定他的值

1 int[] arr = {};
2 var query2 = arr.DefaultIfEmpty();//輸出  0

 

  1.10 Distinct()主要用於去重覆序列

1 int[] arr = {1, 2, 3, 3};
2 var query2 = arr.Distinct();
3 query2.ToList().ForEach(p=> Console.Write(p));//輸出 1  2  3 

  Int類型能夠實現去重覆的原因是Int類型繼承了IComparable,當假如我們想對一個類的一個欄位進行去重覆,我們可以調用Distinct的一個重載方法,傳遞繼承於IEqualityComparer<T>的Class

 1 public class ProductComparer:IEqualityComparer<Product>
 2 {
 3   public bool Equals(Product a, Product b)
 4    {
 5      return a.Index == b.Index;
 6    }
 7 
 8    public int GetHashCode(Product obj)
 9    {
10      return obj.Index;
11    }
12 }
13 
14 public class Product
15 {
16    public int Index { get; set; }
17 }
18 
19  
20 
21 Product[] array = new[]{
23                 new Product() {Index = 1},
24                 new Product() {Index = 2},
25                 new Product() {Index = 2},
26                 new Product() {Index = 3}
27             };
28  
29 
30 ProductComparer pc = new ProductComparer();
31 var query2 = array.Distinct(pc); //輸出  1   2   3

 

  1.11 GroupBy:在SQL中,group by只能跟聚合函數一起搭配使用,但在linq中,groupby出來的東西可以是一個樹形結構

 1 List<Product> list = new List<Product>()
 2 {
 3     new Product() {Index = 1,Value = 1},
 4     new Product() {Index = 2,Value = 2},
 5     new Product() {Index = 2,Value = 3},
 6     new Product() {Index = 3,Value = 3},
 7     new Product() {Index = 4,Value = 5},
 8 };
 9 
10 var query2 = list.GroupBy(p => p.Index).ToList();
11 
12 foreach (var item in query2)
13 {
14     Console.Write(item.Key+"-");
15     foreach (var product in item)
16     {
17         Console.Write(product.Value);
18         Console.WriteLine( );
19     }
20 }   //輸出   1-1  2-2 3   3-3  4-5        

 

  1.12 Intersect(),Except():Intersect是返回兩個序列中相同元素構成的序列,Except則相反

1 int[] arr1 = {1, 2, 3};
2 int[] arr2 = { 2, 5, 6 };
3 var query2 = arr1.Intersect(arr2); //輸出  2

 

  1.13  Concat(),Union():concat用於連接兩個序列,union也是連接兩個序列,但是會剔除相同的項目

 

  1.14 Zip():將兩個序列中index相同的元素,組成一個新的元素,長度以短的為準

1 int[] arr = {1, 2, 3, 4};
2 string[] arr2 = {"", "", "", "", ""};
3 var query = arr.Zip(arr2, (x, y) => string.Format("{0},{1}", x, y));
4 //輸出  1,一  2,二   3,三  4,四

 

 2.返回其他序列類型

  ToArray,ToList,ToDictionary,ToLookUp這幾個都是將IEnumerable<T>轉換成相應類型,就跟平常Tolist一樣,沒有延遲載入,立即返回。

 3.返回序列中的元素

  3.1   ElementAt(),ElementAtOrDefault():ElementAt(index)返回下標值為index的元素,不存在的話拋出異常,用ElementAtOrDefault這個返回該類型的預設值來解決異常情況

  3.2   First(),FirstOrDefault():First 返回滿足條件的第一個序列元素,不存在的話拋出異常,用FirstOrDefault這個返回該類型的預設值來解決異常情況

  3.3   Last(),LastOrDefault():Last返回滿足條件的最後一個序列元素,不存在的話拋出異常,用LastOrDefault這個返回該類型的預設值來解決異常情況

  3.4   Single(),SingleOrDefault():Single跟上面幾個有點不一樣的地方,它要求序列中有且僅有一個滿足條件的項,當大於一項的時候,會拋出異常。SingleOrDefault用於當查詢結果為0項時,返回類型預設值。

 4.返回標量值

  4.1  Count(),LongCount(),Max(),Min(),Average(),Sum():這幾個估計大家都非常熟悉了,憑藉字面意思就能知道大概了,我們直接來看例子:

 1 int[] arr = {1, 2, 3, 4};
 2 int query1 = arr.Count();
 3 Console.WriteLine(query1);  //輸出 4
 4 
 5 int query2 = arr.Max();
 6 Console.WriteLine(query2);//輸出 4
 7 
 8 int query3 = arr.Min();
 9 Console.WriteLine(query3); //輸出 1
10 
11 double query4 = arr.Average();
12 Console.WriteLine(query4); //輸出 2.5
13 
14 int sum = arr.Sum();
15 Console.WriteLine(sum);//輸出 10

 

  4.2  Aggregate():返回自定義的聚合,例如每個元素乘2,再相加

1 int sum2 = arr.Aggregate(0, (total, x) => total + (x*2));
2 Console.WriteLine(  sum2);//輸出20

 

  4.3  Contains(),Any(),All(),SequenceEqual()

      Contains:判斷某一元素是否在存在序列中

      Any:判斷序列中是否存在滿足表達式的元素,只要有一個元素滿足,返回True。我們經常會判斷某一list不為空時,用list.count!=0,這樣是比較浪費性能因為會去統計該list全部個數,當我們用any的時候,只要判斷第一個元素即可

      All:判斷序列中是否全部元素都滿足表達式,只要一個不滿足,則返回fasle

      SequenceEqual:用於逐項比較兩個序列,當兩個序列中元素數目相同,並且元素位置一樣,則返回true,否則false

 

 完結

  感謝大家觀看,祝大家2016年快樂!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • var關鍵字是.net3.5推出的關鍵字,主要是讓編譯器自動推斷並判斷變數類型,類似javascript中的var。在使用一些性能優化軟體時,在代碼優化時,我發現不管定義什麼類型的變數,變數的類型都統統換成var。難道var的性能比具體的類型和object都要高?實踐出真知:新建一個控制台應用程式 ...
  • C#實操FFmpeg的過程記錄
  • 本篇主要介紹如何使用senparc來處理微信公眾平臺的接收消息與發送消息。首先微信端會將用戶的發送的信息以post請求發送到填寫的url上,服務端代碼如下:1 [HttpPost]2 public ActionResult Get(PostModel postMode...
  • 好吧,《重構》這本書的第五章,主要是對即將要寫到的一些具體重構手法的寫作結構的一種描述,並沒有什麼重要的東西。仿佛是為了慶祝元旦的放假,特意給我準備的章節,為了讓我完成今天的任務而特意水了一章。好吧,還是有一句重要的話:設計模式為重構提供了目標,而重構是到達之路。以下是我的廢話,大神莫笑:如果你不明...
  • 有一段時間,正則表達式學習很火熱很潮流,當時在CSDN一天就能看到好幾個正則表達式的帖子,那段時間藉助論壇以及Wrox Press出版的《C#字元串和正則表達式參考手冊》學習了一些基礎的知識,同時也為我在CSDN大概賺了1000分,今天想起來,去找《C#字元串和正則表達式參考手冊》時,已經不知所蹤了...
  • 最近公司一個項目上線後,經常崩潰,於是開始重視性能問題,在網上看到了許多相關文章,整理下發了上來。以備參考。在用ASP.NET開髮網站的時候,性能是永遠需要考慮和關註的問題,性能不僅僅只是程式代碼執行時候的速度,而是涉及到方方面面的東西。就拿ASP.NET的一個請求來講,從瀏覽器向伺服器的ASP.N...
  • 反射(Reflection)是.NET中的重要機制,通過放射,可以在運行時獲得.NET中每一個類型(包括類、結構、委托、介面和枚舉等)的成員,包括方法、屬性、事件,以及構造函數等。還可以獲得每個成員的名稱、限定符和參數等。有了反射,即可對每一個類型瞭如指掌。如果獲得了構造函數的信息,即可直接創建對象...
  • 1.自治視圖 在早期(作者也沒說明是多早,自己猜吧),我們傾向於將所有與UI相關的操作糅合在一起(現在我身邊還有很多人這樣做),這些操作包括UI界面的呈現、用戶交互操作的捕捉與響應(UI處理邏輯)、業務流程的執行及對數據的存取等,我們將這種設計模式稱為自治視圖(AV)。 自治視圖在應用程式的重用性、...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...