【Linq】常用語法彙總

来源:https://www.cnblogs.com/blackarrow/archive/2018/03/20/8554063.html
-Advertisement-
Play Games

語言繼承查詢(Language Integrated Query, LINQ),在C#編程語言中集成了查詢語法,可以用相同的語法訪問不同的數據源,LINQ提供了不同數據源的抽象層,所以可以使用相同語法。 1、條件查詢(Where) 需要註意的是,延遲查詢 解決這個問題,只需要用 ToList(); ...


語言繼承查詢(Language Integrated Query, LINQ),在C#編程語言中集成了查詢語法,可以用相同的語法訪問不同的數據源,LINQ提供了不同數據源的抽象層,所以可以使用相同語法。

public class Book
{
    public int Id { get; set; }
    /// <summary>
    /// 書名
    /// </summary>
    public string BookName { get; set; }
    /// <summary>
    /// 作者id
    /// </summary>
    public int AutherId { get; set; }
    /// <summary>
    /// 類型
    /// </summary>
    public string Type { get; set; }
    /// <summary>
    /// 售價
    /// </summary>
    public decimal Price { get; set; }
    /// <summary>
    /// 銷量
    /// </summary>
    public int Sales { get; set; }
}
public class Auther
{
    public int Id { get; set; }
    /// <summary>
    /// 作者
    /// </summary>
    public string AutherName { get; set; }
}
public class Library
{
    public string Address { get; set; }
    /// <summary>
    /// 書本
    /// </summary>
    public List<Book> BookList { get; set; }
}

1、條件查詢(Where)

 var query = from book in bookList
             where book.Price > 50
             orderby book.Sales descending,book.BookName
             select book;
//等同於
var query = bookList.Where(n => n.Price > 50).OrderByDescending(g => g.Sales).ThenBy(y => y.BookName);

  需要註意的是,延遲查詢

var ary = new List<string>(){ "Aa", "Bb", "Cc"};

var a1 = ary.Where(n => n.Contains("a"));//["Aa"]

ary.Add("Ga");

a1;//["Aa", "Ga"]

  解決這個問題,只需要用 ToList();

var ary = new List<string>(){ "Aa", "Bb", "Cc"};

var a1 = ary.Where(n => n.Contains("a")).ToList();//["Aa"]

ary.Add("Ga");

a1;//["Aa"]

  索引篩選

//銷量大於50且為奇數行
var query = bookList.Where((n, index) => n.Sales > 50 && index%2 != 0);

2、複合查詢(SelectMany)

//查找所有圖書館中的小說
var query = from library in libraryList
            from book in library.BookList
            where book.Type == "小說"
            select book;

//等同於
query = libraryList.SelectMany(n => n.BookList).Where(g => g.Type == "小說");

//組織返回結果
query = libraryList.SelectMany(n => n.BookList,  (n, g) => new {n.Address, g.BookName, g.Sales}).Where(y => y.Sales > 100);

3、集合連接

//內連接
var query1 = from book in bookList
         join auther in autherList on book.AutherId equals auther.Id
         select new { book.BookName, auther.AutherName };
//組連接
var query2 = from auther in autherList
           join book in bookList on auther.Id equals book.AutherId into items
           select new { auther.AutherName, Books = items };
//左外連接
var query3 = from book in bookList
            join auther in autherList on book.AutherId equals auther.Id into items
            from auther in items.DefaultIfEmpty()
            select new
            {
                book.BookName,
                AutherName = auther == default(Auther) ? "" : auther.AutherName
            };
//多條件連接
var query4 = from book in bookList
    join auther in autherList on new {name = book.BookName, id = book.AutherId} equals new {name = auther.AutherName, id = auther.Id}
    select book;

4、排序(OrderBy、ThenBy)

var query = from book in bookList
                orderby book.Sales descending, book.AutherId, book.Price descending 
                select book;
//等同於
query = bookList.OrderByDescending(n => n.Sales).ThenBy(g => g.AutherId).ThenByDescending(y => y.Price);

5、分組(GroupBy)

//單一條件分組
var query = from book in bookList
                        group book by book.Type into bs
                        select bs.First();
//等同於
query = bookList.GroupBy(n => n.Type).Select(g => g.First());

//多條件分組
var query = from book in bookList
            group book by new { book.Type, book.AutherId } into bs
            select new
            {
                Type = bs.First().Type,
                AutherId = bs.First().AutherId,
                Count = bs.Count()
            };
//等同於
query = bookList.GroupBy(n => new {n.Type, n.AutherId}).Select(g => new
            {
                Type = g.First().Type,
                AutherId = g.First().AutherId,
                Count = g.Count()
            });

6、合併與分區(Zip、Take、Skip)

int[] numbers = { 1, 2, 3 };
string[] words = { "One", "Two", "Three", "Four" };
//元素依次組合,長度為較小的集合
IEnumerable<string> zip = numbers.Zip(words, (n, g) => n + "=" + g);//["1=One", "2=Two", "3=Three"]

//跳過集合的前n個元素
var skip = words.Skip(3);//["Four"]
//獲取集合的前n個元素,有延遲
var take = numbers.Take(2);//[1, 2]

int pageSize = 3;//每頁容量
int pageNum = 0;//頁數
var page = words.Skip(pageSize * pageNum).Take(pageSize);//["One", "Two", "Three"]

7、集合操作(Distinct、Union、Concat、Intersect、Except)

int[] ary1 = {1, 2, 2, 4, 5};
int[] ary2 = {3, 5, 5, 6, 10, 7};

//合併,自動去重
var union = ary1.Union(ary2);//1, 2, 3, 4, 5, 6, 7, 10
//合併,不會去重
var concat = ary1.Concat(ary2);//1, 2, 2, 4, 5, 3, 5, 5, 6, 10, 7
//去重
var distict = ary1.Distinct();//1, 2, 4, 5
//取交集,自動去重
var intersect = ary1.Intersect(ary2);//5
//取補集,自動去重
var except = ary1.Except(ary2);//1, 2, 4

8、類型篩選(ofType)

object[] data = { "one", 1 , 2 ,"three"};
var query = data.ofType<string>();

9、聚合操作符(Count、Sum、Min、Max、Average、Aggregate)

//個數
var count = bookList.Count(n => n.Sales > 50);
//求和
var sum = bookList.Sum(n => n.Price);
//最小值
var min = bookList.Min(n => n.Sales);
//最大值
var max = bookList.Max(n => n.Price);
//平均值
var average = bookList.Average(n => n.Sales);
//累加,總銷量
var aggregate1 = bookList.Select(n => n.Sales).Aggregate((g, y) => g + y);
//累加,初始值
var aggregate2 = bookList.Select(n => n.Sales).Aggregate(10, (g, y) => g + y);
//累加,初始值,結果處理
var aggregate3 = bookList.Select(n => n.Sales).Aggregate(10, (g, y) => g + y, result => result/100);

10、轉換操作符 (ToArray、ToDictionary、ToList、ToLookup、Cast)

Book[] ary = bookList.ToArray();

List<Book> list = bookList.ToList();

Dictionary<int, Book> dic = bookList.ToDictionary<Book, int>(n => n.Id);

//轉換成LookUp集合,key-以key分組的內部集合
ILookup<string, Book> look = bookList.ToLookup(n => n.Type);

IEnumerable<Book> cast = ary.Cast<Book>();

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

-Advertisement-
Play Games
更多相關文章
  • 前言:單體項目拆分為SOA分散式架構後,關於介面層的定義規範尤其重要。今天就總結一下關於一次不規範的定義介面導致的問題。 #首先我目前從事的項目架構大致是下圖這樣的: 主技術棧:dubbo+spring boot;其中我們內部的wap、app、pc都有相似的業務,例如user-service。 #出 ...
  • 介紹什麼是數組,創建數組,輸出數組,添加或刪除數組元素,定位數組元素,遍曆數組,確定數組的大小和唯一性,數組排序,合併,拆分,接合和分解數組,其他有用的數組函數 ...
  • autofac官網: http://autofaccn.readthedocs.io/en/latest/getting-started/index.html autofac作為一個熱門ioc框架,還是有瞭解一下的必要的。這裡用兩個小案例來簡單說說autofac在.net framework控制台應 ...
  • 在 Mvc 中簡單使用日誌組件 基於 .Net Core 2.0,本文只是蜻蜓點水,並非深入淺出。 目錄 使用內置的日誌組件 簡單過渡到第三方組件 - NLog 使用內置的日誌 下麵使用控制器 HomeController.cs 進行演示。 需要 using Microsoft.Extensions ...
  • 正則表達式是對字元串操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,組成一個“規則字元串”,這個“規則字元串”用來表達對字元串的一種過濾邏輯。 C#中經常會遇到要查找某一個字元串中的子字元串,就需要用到Regex類,而下麵是各個字元的描述: 元字元 描述 \ 將下一個字元標 ...
  • 前沿 其實本來是想把標題叫做持續集成的,只是後來看看研究出的內容,就只有發佈這一個動作,自動化測試等內容也未涉及到,所以改名叫持續編譯及發佈應該更加貼切吧? 問題背景 其實目前我們傳統方式上的發佈方式,一般都是開發人員本地打包,然後傳給測試,測試完成之後,發包到項目經理或者實施人員,最後進行部署,對 ...
  • 今天簡單記錄一個知識點:WPF自定義視窗基類,常用winform的人知道,winform的窗體繼承是很好用的,寫一個基礎窗體,直接在後臺代碼改寫繼承窗體名。但如果是WPF要繼承窗體,我個人感覺沒有理解之前:好難,不懂怎麼處理還是不可以繼承;但理解之後就是很簡單了。 第一次嘗試使用WPF直接修改後臺代 ...
  • 隨著培訓機構的增多,越來越多的人進入IT行業。那麼對於我們這些自學出來,經驗不夠豐富的轉行者來說,我們需要掌握最起碼的一些東西,這對於面試很有用,而且在工作中也很常用。本人在學習了網上各位大神關於一些知識點的總結和研究後,總結了這麼一套東西。祝大家都能工作順利,找到自己滿意的工作。 重寫:當一個子類 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...