最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中Linq的入門教程

 更新時間:2022年05月26日 16:57:16   作者:springsnow  
這篇文章介紹了C#中Linq的基礎操作,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、LINQ的體系結構

語言集成查詢 (LINQ) (C#) | Microsoft 官方文檔

LINQ總共包括五個部分:

 

程序集

命名空間

描述

LINQ to Objects

System.Core.dll

System.Linq

提供對內存中集合操作的支持

LINQ to XML

System.Xml.Linq.dll

System.Xml.Linq

提供對XML數據源的操作的支持

LINQ to SQL

System.Data.Linq.dll

System.Data.Linq

提供對Sql Server數據源操作的支持。(微軟已宣布不再更新,推薦使用LINQ to Entities)

LINQ to DataSet

System.Data.DataSetExtensions.dll

System.Data

提供對離線數據集DataTable操作的支持。

LINQ to Entities

System.Core.dll 和System.Data.Entity.dll

System.Linq和System.Data.Objects

LINQ to Entities 是 Entity Framework 的一部分并且取代LINQ to SQL 作為在數據庫上使用 LINQ 的標準機制。

目前,除了以下的,還可以下載其他第三方提供程序,例如LINQ to JSON、LINQ to MySQL、LINQ to Amazon、LINQ to Flickr和LINQ to SharePoint。無論使用什么數據源,都可以通過LINQ使用相同的API進行操作。

二、 LINQ的語法

1、Query查詢表達式語法

LINQ查詢表達式以from子句開頭,以select子句或group子句結束。

在兩個子句之間,可以使用where、orderby、join、let等查詢操作符。

關鍵字有: from 、where 、select 、group 、into 、orderby、join、let、in、on、equals、by、ascending、descending等。

  • from…in…:指定要查找的數據源以及范圍變量,多個from子句則表示從多個數據源查找數據。注意:c#編譯器會把“復合from子句”的查詢表達式轉換為SelectMany()擴展方法。
  • join…in…on…equals…:指定多個數據源的關聯(lián)方式
  • let:引入用于存儲查詢表達式中子表達式結果的范圍變量。通常能達到層次感會更好,使代碼更易于閱讀。
  • orderby、descending:指定元素的排序字段和排序方式。當有多個排序字段時,由字段順序確定主次關系,可指定升序和降序兩種排序方式
  • where:指定元素的篩選條件。多個where子句則表示了并列條件,必須全部都滿足才能入選。每個where子句可以使用謂詞&&、||連接多個條件表達式。
  • group:指定元素的分組字段。
  • select:指定查詢要返回的目標數據,可以指定任何類型,甚至是匿名類型。(目前通常被指定為匿名類型)
  • into:提供一個臨時的標識符。該標識可以引用join、group和select子句的結果。 
    1) 直接出現在join子句之后的into關鍵字會被翻譯為GroupJoin。(into之前的查詢變量可以繼續(xù)使用) 
    2) select或group子句之后的into它會重新開始一個查詢,讓我們可以繼續(xù)引入where, orderby和select子句,它是對分步構建查詢表達式的一種簡寫方式。(into之前的查詢變量都不可再使用)

編譯器會在程序編譯時轉換LINQ查詢,以調用相應的擴展方法。

下面是一個簡單的示例,查詢一個int數組中小于5的元素,并按照從小到大的順序排列:

int[] arr = new int[] { 1, 4, 2, 6, 7, 9, 5, 1, 2, 4 };
var query = from r in arr
            where r < 5
            orderby r
            select r;
foreach (var item in query)
{
    Console.WriteLine(item);
}
Console.ReadLine();

Linq語句最終被轉換為調用IEnumerable<T>的擴展方法,在System.Linq.Enumerable靜態(tài)類中定義了N多擴展。所以只要繼承與IEnumerable的類都支持Linq查詢 。

2、Lambda語法

標準查詢操作符

Enumberable 類定義的標準查詢操作符。

  • 篩選操作符:定義返回元素的條件。 
    Where:使用謂詞,返回符合條件的元素。 
    OfType<TResult>:返回符合類型的元素。 
  • 投射操作符:用于把對象轉換為另一個類型的新對象。 
    Select :定義根據選擇器函數選擇結果值的投射。 
    SelectMany:定義根據選擇器函數選擇結果值的投射。 
  • 排序操作符:改變返回的元素的順序。 
    Orderby: 升序排序。 
    OrderBydescending:  降序排序。 
    ThenBy 和 ThenByDescending: 二次排序。 
    Reverse: 反轉集合元素。 
  • 連接操作符:用于合并不直接相關的集合。 
    Join:   根據鍵選擇器函數連接兩個集合。 
    GroupJoin:   連接兩個集合,并分組。 
  • 組合操作符:把數據放在組中。 
    GroupBy  : 組合公共鍵的元素。 
    ToLookup:創(chuàng)建一個一對多字典,組合元素。 
  • 限定(量詞)操作符:元素滿足指定的條件。 
    Any :部分滿足謂詞函數的元素。 
    All : 所有元素是否都滿足謂詞函數。 
    Contains:   檢查某個元素是否在集合中。 
  • 分區(qū)操作符:返回集合的子集。 
    Take: 從集合提取元素個數。 
    Skip :跳過指定的元素個數,提取其他元素。 
    TakeWhile :提取條件為真的元素。 
    SkipWhile:提取條件為真的元素。 
  • Set操作符:返回一個集合。 
    Distinct :(去重)刪除重復的元素。 
    Union: (并集)返回集合中唯一元素。 
    Intersect:(交集)返回兩個集合都有的元素。 
    Except : (差集)只出現在一個集合中的元素。 
    Zip: 兩個集合合并為一個元素。 
  • 元素操作符:返回一個元素。 
    First:返回第一個滿足條件的元素。 
    FirstOrDefault:類似First,如果未找到,返回類型的默認值。 
    Last:返回最后一個滿足條件的元素。 
    LastOrDefault:類似Last,如果未找到,返回類型的默認值。 
    ElementAt:返回元素的位置。 
    ElementAtOrDefault:指定索引(超出索引,取默認值) 
    Single:返回一個滿足條件的元素。如果有多個元素都滿足條件,就拋出一個異常。 
    SingleOrDefault:類似Single,如果非唯一或者找不到,返回類型的默認值。 
  • 聚合操作符:計算集合值。 
    Sum: 總和。 
    Count:  所有元素個數。 
    LongCount:計數(大型集合) 
    Min:  最小元素。 
    Max : 最大元素。 
    Average: 平均值。 
    Aggregate:  根據輸入的表達式獲取聚合值。 
  • 轉換操作符: 
    ToArray:變成數組 
    AsEnumerable:變成IEnumeralbe<T> 
    AsQueryable:變成IQueryable 
    ToList:變成List<T> 
    ToDictionary:變成字典 
    Cast<TResult> :轉換 
    ToLookup:變一對多字典Lookup<Tkey,TElement> 
  • 生成操作符: 
    Empty :空集合。 
    DefaultIfEmpty:默認值集合 
    Range:返回一系列數字。 
    Repeat: 返回始終重復一直的集合。 
  • 等值操作 
    SequenceEqual:成對比較 
  • 串聯(lián)操作 
    Concat:串聯(lián)

3、擴展方法存在對應的查詢表達式關鍵字:

  • Where:where
  • Select:select
  • SelectMany:使用多個 from 子句
  • OrderBy:orderby
  • ThenBy:orderby …, …
  • OrderByDescending:orderby … descending
  • ThenByDescending:orderby …, … descending
  • GroupBy:group … by 或 group … by … into …
  • Join:join … in … on … equals …
  • GroupJoin: join … in … on … equals … into … 

三、LINQ的特性

1、延遲執(zhí)行查詢

LINQ具有“延遲計算”的特性。

Linq的執(zhí)行不是在Linq的賦值語句執(zhí)行,而是在通過foreach遍歷訪問結果時執(zhí)行。

var names = new List<string> { "Nino", "Alberto", "Juan", "Mike", "Phil" };

var namesWithJ = (from n in names
                  where n.StartsWith("J")
                  orderby n
                  select n);

Console.WriteLine("First iteration");
foreach (string name in namesWithJ)
{
    Console.WriteLine(name);
}
Console.WriteLine();

names.Add("John");
names.Add("Jim");
names.Add("Jack");
names.Add("Denny");

Console.WriteLine("Second iteration");
foreach (string name in namesWithJ)
{
    Console.WriteLine(name);
}

返回的結果是:

兩次遍歷的結果不一樣,說明執(zhí)行并不是在Linq的定義語句執(zhí)行,而是在foreach執(zhí)行。

換成如下,兩次執(zhí)行結果就一樣了。

var namesWithJ = (from n in names
                  where n.StartsWith("J")
                  orderby n
                  select n
).ToList();

2、運算符延遲計算符號

按字母順序整理:

1、具有延遲計算的運算符

Cast,Concat,DefaultIfEmpty,Distinct,Except,GroupBy,GroupJoin,Intersect,Join,OfType,OrderBy,OrderByDescending,Repeat,Reverse,Select,SelectMany,Skip,SkipWhile,Take,TakeWhile,ThenBy,ThenByDescending,Union,Where,Zip

2、立即執(zhí)行的運算符

對一系列源元素執(zhí)行聚合函數的查詢必須首先循環(huán)訪問這些元素。CountMax、Average 和 First 就屬于此類查詢。

由于查詢本身必須使用 foreach 以便返回結果,因此這些查詢在執(zhí)行時不使用顯式 foreach 語句,直接立即執(zhí)行。

Aggregate,All,Any,Average,Contains,Count,ElementAt,ElementAtOrDefault,Empty,First,FirstOrDefault,Last,LastOrDefault,LongCount,Max,Min,Range,SequenceEqual,Single,SingleOrDefault,Sum,ToArray,ToDictionary,ToList,ToLookup

注意:特殊的AsEnumerable運算符,用于處理LINQ to Entities操作遠程數據源,將IQueryable遠程數據立即轉化為本地的IEnumerable集合。若AsEnumerable接收參數是IEnumerable內存集合則什么都不做。

3、強制立即執(zhí)行

若要強制立即執(zhí)行任意查詢并緩存其結果,可以調用 ToList<TSource> 或 ToArray<TSource> 方法。

通過調用 ToList 或 ToArray,可以將所有數據緩存在單個集合對象中。

var numQuery2 =
           (from num in numbers
            where (num % 2) == 0
            select num).ToList();
var numQuery3 =
          (from num in numbers
           where (num % 2) == 0
            select num).ToArray();

四、使用 LINQ 進行數據轉換

語言集成查詢 (LINQ) 不僅可用于檢索數據,而且還是一個功能強大的數據轉換工具。

通過使用 LINQ 查詢,您可以將源序列用作輸入,并采用多種方式修改它以創(chuàng)建新的輸出序列。您可以通過排序和分組來修改該序列,而不必修改元素本身。

但是,LINQ 查詢的最強大的功能是能夠創(chuàng)建新類型。這一功能在 select 子句中實現。

例如,可以執(zhí)行下列任務:

1、將多個輸入聯(lián)接到一個輸出序列

class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string City { get; set; }
    public List<int> Scores { get; set; }
}

class Teacher
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public string City { get; set; }
}

private static void Main(string[] args)
{
    //創(chuàng)建第一個數據源
    var students = new List<Student>() {
            new Student () {
            Age = 23,
            City = "廣州",
            Name = "小C",
            Scores = new List<int> () { 85, 88, 83, 97 }
            },
            new Student () {
            Age = 18,
            City = "廣西",
            Name = "小明",
            Scores = new List<int> () { 86, 78, 85, 90 }
            },
            new Student () {
            Age = 33,
            City = "夢里",
            Name = "小叁",
            Scores = new List<int> () { 86, 68, 73, 97 }
            }
        };

    //創(chuàng)建第二個數據源
    var teachers = new List<Teacher>() {
            new Teacher () {
            Age = 35,
            City = "夢里",
            Name = "啵哆"
            },
            new Teacher () {
            Age = 28,
            City = "云南",
            Name = "小紅"
            },
            new Teacher () {
            Age = 38,
            City = "河南",
            Name = "麗麗"
            }
        };

    //創(chuàng)建查詢
    var peopleInDreams = (from student in students
                          where student.City == "夢里"
                          select student.Name)
                .Concat(from teacher in teachers
                        where teacher.City == "夢里"
                        select teacher.Name);

    //執(zhí)行查詢
    foreach (var person in peopleInDreams)
    {
        Console.WriteLine(person);
    }

    Console.Read();
}

結果

小叁 
啵哆

2、選擇各個源元素的子集

1. 若要只選擇源元素的一個成員,請使用點運算。

var query = from cust in Customers
               select cust.City;

2. 若要創(chuàng)建包含源元素的多個屬性的元素,可以使用具有命名對象或匿名類型的對象初始值設定項。

var query = from cust in Customer
               select new {Name = cust.Name, City = cust.City};

3、將內存中的對象轉換為 XML

//創(chuàng)建數據源
var students = new List<Student>()
            {
                new Student()
                {
                    Age = 18,
                    Name = "小A",
                    Scores = new List<int>() {88,85,74,66 }
                },
                new Student()
                {
                    Age = 35,
                    Name = "小B",
                    Scores = new List<int>() {88,85,74,66 }
                },
                new Student()
                {
                    Age = 28,
                    Name = "小啥",
                    Scores = new List<int>() {88,85,74,66 }
                }
            };

//創(chuàng)建查詢
var studentsToXml = new XElement("Root",
    from student in students
    let x = $"{student.Scores[0]},{student.Scores[1]},{student.Scores[2]},{student.Scores[3]}"
    select new XElement("student",
           new XElement("Name", student.Name),
           new XElement("Age", student.Age),
           new XElement("Scores", x))
);

//執(zhí)行查詢
Console.WriteLine(studentsToXml);

4、 對源元素執(zhí)行操作

輸出序列可能不包含源序列的任何元素或元素屬性。

輸出可能是通過將源元素用作輸入參數計算出的值的序列。

//數據源
double[] radii = { 1, 2, 3 };

//創(chuàng)建查詢
var query = from radius in radii
            select $"{radius * radius * 3.14}";

//執(zhí)行查詢
foreach (var i in query)
{
    Console.WriteLine(i);
}

到此這篇關于C#中Linq用法的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • C#泛型相關講解

    C#泛型相關講解

    我們在編寫程序時,經常 遇到兩個模塊的功能非常相似,只是一個是處理int數據,另一個是處理string數據,或者其他自定義的數據類型
    2013-05-05
  • C#中的協(xié)變與逆變深入講解

    C#中的協(xié)變與逆變深入講解

    這篇文章主要給大家介紹了關于C#中協(xié)變與逆變的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-12-12
  • C#隱藏控制臺鍵盤輸入的方法

    C#隱藏控制臺鍵盤輸入的方法

    這篇文章主要介紹了C#隱藏控制臺鍵盤輸入的方法,涉及C#針對系統(tǒng)底層調用的相關技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • c# SqlDataAdapter中的Fill是怎么實現的

    c# SqlDataAdapter中的Fill是怎么實現的

    這篇文章主要介紹了c# SqlDataAdapter中的Fill是怎么實現的,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • Unity實現模型點擊事件的方法

    Unity實現模型點擊事件的方法

    這篇文章主要介紹了Unity實現模型點擊事件的方法,本文通過多種方法給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • Mongodb在CSharp里實現Aggregate實例

    Mongodb在CSharp里實現Aggregate實例

    本篇文章主要介紹了Mongodb在CSharp里實現Aggregate實例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • C# partial關鍵字說明

    C# partial關鍵字說明

    C# 中可以將類、結構或接口的定義拆分到兩個或多個源文件中,在類聲明前添加partial關鍵字即可,通過本文給大家介紹C# partial關鍵字說明,需要的朋友參考下
    2016-02-02
  • c#中的擴展方法學習筆記

    c#中的擴展方法學習筆記

    擴展方法能夠向現有類型“添加”方法,而無需創(chuàng)建新的派生類型,重新編譯或以其他方式修改原始類型。下面這篇文章主要給大家介紹了關于c#中擴展方法學習的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-11-11
  • 在winform下實現左右布局多窗口界面的方法之續(xù)篇

    在winform下實現左右布局多窗口界面的方法之續(xù)篇

    這篇文章主要介紹了在winform下實現左右布局多窗口界面的方法之續(xù)篇 的相關資料,需要的朋友可以參考下
    2016-02-02
  • C#中時間類的使用方法詳解

    C#中時間類的使用方法詳解

    這篇文章主要介紹C#中的時間類,文中主要介紹了DateTime類,TimeSpan類,DateTimeOffset類及靜態(tài)類的封裝,通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-05-05

最新評論

马龙县| 会理县| 胶南市| 鲁甸县| 阿拉善左旗| 新郑市| 溆浦县| 明光市| 九江县| 襄汾县| 多伦县| 汉寿县| 佳木斯市| 溆浦县| 静安区| 西畴县| 洪泽县| 宽城| 射阳县| 阜新| 平利县| 兴和县| 中超| 新龙县| 丹江口市| 叶城县| 绥阳县| 甘肃省| 洪江市| 方城县| 获嘉县| 峨眉山市| 偃师市| 义乌市| 高清| 安龙县| 昌图县| 通渭县| 吴川市| 曲周县| 若尔盖县|