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

C# LINQ查詢表達(dá)式及對應(yīng)LAMBDA表達(dá)式的用法

 更新時間:2021年04月13日 09:04:55   作者:hello黃先森  
這篇文章主要介紹了C# LINQ查詢表達(dá)式及對應(yīng)LAMBDA表達(dá)式的用法,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下

C#編程語言非常優(yōu)美,我個人還是非常贊同的。特別是在學(xué)習(xí)一段時間C#后發(fā)現(xiàn)確實在它的語法和美觀度來說確實要比其它編程語言強一些(也可能是由于VS編譯器的加持)用起來非常舒服,而且對于C#我覺得他最優(yōu)美之處不僅僅是語法糖方面還有就是體現(xiàn)在LINQ和Lambda表達(dá)式。

本篇文簡單介紹一下關(guān)于C#當(dāng)中LINQ表達(dá)式和其對應(yīng)的Lambda表達(dá)式的用法,關(guān)于這兩部分內(nèi)容的相關(guān)參考資料:

人民郵電出版社《C#程序設(shè)計及應(yīng)用教程》(第3版)

博客:《c# Linq查詢

同時在介紹的時候我會盡量挑出重要部分同時加上我自己的理解和認(rèn)識,如有偏差還請指教。

首先先讓我們看一下什么是LINQ查詢表達(dá)式和Lambda表達(dá)式:

運行結(jié)果:

以上是對LINQ查詢表達(dá)式和Lambda表達(dá)式的一個簡單的應(yīng)用,都是查詢stu列表中年齡大于等于20歲的結(jié)果并且把結(jié)果按照年齡降序排列。

由此可見Linq表達(dá)式和Lambda表達(dá)式并沒有什么可比性,只是用Lambda可以實現(xiàn)LINQ的查詢語句。

那與Lambda表達(dá)式相關(guān)的整條語句稱作什么呢?在微軟并沒有給出官方的命名,在《深入理解C#》中稱其為“點標(biāo)記”。

例子中主要以LINQ表達(dá)式為主,LINQ表達(dá)式結(jié)構(gòu)更為清晰易于理解,同時也會給出對應(yīng)的點標(biāo)記寫法(所有的LINQ查詢表達(dá)式都可以轉(zhuǎn)成對應(yīng)的點標(biāo)記。反之,不是所有的點標(biāo)記都可以轉(zhuǎn)成查詢表達(dá)式。),所以如果想要了解這部分的讀者也請往下看。本文會介紹LINQ查詢表達(dá)式用法以及對應(yīng)的Lambda表達(dá)式。

LINQ查詢表達(dá)式是一組查詢技術(shù)的統(tǒng)稱,其主要思想是將各種查詢功能直接集成到C#語言中,不論是對象、XML、還是數(shù)據(jù)庫都可以用LINQ編寫查詢語句。LINQ與傳統(tǒng)迭代技術(shù)實現(xiàn)的查詢優(yōu)勢在于更簡明、更易讀這種優(yōu)勢特別是在篩選多個條件時更為顯著;使用很少的程序代碼便能實現(xiàn)復(fù)雜的查詢和篩選;無需修改或者是進(jìn)行很少的修改就能移植到其它的數(shù)據(jù)源。LINQ查詢語句并不復(fù)雜并且與SQL語句有些類似,學(xué)習(xí)起來難度并不大。

接下來直接看LINQ查詢例子:

//以下為例子中涉及查詢的數(shù)據(jù)
List<Student> stu = new List<Student>()
{
  new Student(){Id = 1,Name = "王同學(xué)",Age = 24},
  new Student(){Id = 2,Name = "王同學(xué)",Age = 30},
  new Student(){Id = 3,Name = "王同學(xué)",Age = 21},
  new Student(){Id = 4,Name = "趙同學(xué)",Age = 20},
  new Student(){Id = 5,Name = "錢同學(xué)",Age = 22},
  new Student(){Id = 6,Name = "孫同學(xué)",Age = 23},
  new Student(){Id = 7,Name = "周同學(xué)",Age = 23},
   new Student(){Id = 8,Name = "吳同學(xué)",Age = 20},
  new Student(){Id = 9,Name = "鄭同學(xué)",Age = 25},
  new Student(){Id = 10,Name = "蔣同學(xué)",Age = 26}
};

查詢年齡是30歲的王同學(xué)的信息:

//查詢年齡是30歲的王同學(xué)的信息
var res = from t in stu
    where t.Name == "王同學(xué)" && t.Age == 30
    select t;

//對應(yīng)的Lambda表達(dá)式
//var res1 = stu.Where(t => t.Age == 30 && t.Name == "王同學(xué)");

foreach (var item in res)//顯示查詢結(jié)果
{
    Console.Write("學(xué)號:"+item.Id+"\n姓名:"+item.Name+"\n年齡:"+item.Age);
}

運行結(jié)果:

LINQ查詢表達(dá)式必須以form子句開頭,并且必須以select或group子句結(jié)尾。在第一個from子句和最后一個select或group子句之間,查詢表達(dá)式可以包含一個或者多個where、orderby、join、let甚至附加from子句。LINQ表達(dá)式整體的用法和SQL語句很像,在上面的例子中就可以看出。

上面的例子的含義就是從數(shù)據(jù)源stu中查詢一個數(shù)據(jù)“t”,“t”滿足的條件就是它的Name是王同學(xué)同時它的Age是30,然后查詢這個“t”。LINQ查詢語句的返回值類型為IEnumerable<T>,LINQ執(zhí)行查詢時,一般利用foreach循環(huán)執(zhí)行查詢得到一個序列,這這種方式稱為“延遲執(zhí)行”。

什么是“延遲執(zhí)行”?還是上面例子中的查詢:

//查詢年齡是30歲的王同學(xué)的信息
var res = from t in stu
    where t.Name == "王同學(xué)" && t.Age == 30
    select t;
//var res1 = stu.Where(t => t.Age == 30 && t.Name == "王同學(xué)");Lambda表達(dá)式寫法

foreach (var item in res)
{
    Console.Write("學(xué)號:"+item.Id+"\n姓名:"+item.Name+"\n年齡:"+item.Age);
}

Console.WriteLine("\n--------------------------------------------------------------------------");

stu.Add(new Student(){Id = 11,Name = "王同學(xué)",Age = 30});

foreach (var item in res)
{
    Console.Write("學(xué)號:" + item.Id + "\n姓名:" + item.Name + "\n年齡:" + item.Age);
    Console.WriteLine();
}

運行結(jié)果:

延遲查詢就是只需構(gòu)造一次查詢語句,可以多次使用。在List中添加新元素之后并沒有重新執(zhí)行查詢操作,然而res中的結(jié)果卻根據(jù)List中元素的改變相應(yīng)發(fā)生了改變。

從學(xué)生中選出年齡小于25歲并且按照年齡降序排列

//從學(xué)生中選出年齡小于25歲并且按照年齡降序排列
var res = from t in stu
    where t.Age < 25
    orderby t.Age descending
    select t;
//var res1 = stu.Where(t => t.Age < 25).OrderByDescending(t => t.Age).Select(t => t);Lambda寫法

foreach (var item in res)
{
    Console.Write("學(xué)號:" + item.Id + "\n姓名:" + item.Name + "\n年齡:" + item.Age);
    Console.WriteLine();
}

運行結(jié)果:

從學(xué)生中查詢姓王的同學(xué)的信息并且按照年齡降序排列

//從學(xué)生中查詢姓王的同學(xué)的信息并且按照年齡降序排列
var res = from t in stu
    from n in t.Name
    where n == '王'//名字中帶有王字
    orderby t.Age descending
    select t;
//var res1 = stu.Where(t => t.Name.IndexOf("王") == 0).OrderByDescending(t => t.Age);lambda表達(dá)式

foreach (var item in res)
{
    Console.Write("學(xué)號:" + item.Id + "\n姓名:" + item.Name + "\n年齡:" + item.Age);
    Console.WriteLine();
}

運行結(jié)果:

學(xué)生信息按照年齡、Id進(jìn)行排序

//參數(shù)越靠前,優(yōu)先級越高
//先按age排序,當(dāng)分?jǐn)?shù)相同時再按id排序...依次類推

 var res = from t in stu
    orderby t.Age, t.Id
    select t;
//var res1 = stu.OrderBy(t => t.Age).ThenBy(t => t.Id);Lambda表達(dá)式

foreach (var item in res)
{
    Console.Write("學(xué)號:" + item.Id + "\n姓名:" + item.Name + "\n年齡:" + item.Age);
    Console.WriteLine();
}

運行結(jié)果:

按照年齡進(jìn)行分組,查詢相同年齡數(shù)量大于2的內(nèi)容

//按照年齡進(jìn)行分組,查詢相同年齡數(shù)量大于2的內(nèi)容
var res = from t in stu
    group t by t.Age into s
    where s.Count()>=2
    select s;
//var res1 = stu.GroupBy(t => t.Age).Where(s => s.Count() >= 2);lambda表達(dá)式

foreach (var item in res)
{
    foreach (var items in item)
    {
        Console.Write("學(xué)號:" + items.Id + "\n姓名:" + items.Name + "\n年齡:" + items.Age);
        Console.WriteLine();
    }
    Console.WriteLine();
}

運行結(jié)果:

查詢出集合qSt中year等于集合qSc中year的元素并形成新的集合

List<s> pSt = new List<s>();
pSt.Add(new s() { year = 1999, name = "小張" });
pSt.Add(new s() { year = 2000, name = "小王" });
pSt.Add(new s() { year = 2001, name = "小李" });
pSt.Add(new s() { year = 2010, name = "小趙" });
List<school> pSc = new List<school>();
pSc.Add(new school() { year = 1999, name = "aaa" });
pSc.Add(new school() { year = 2001, name = "bbb" });
pSc.Add(new school() { year = 2002, name = "ccc" });
pSc.Add(new school() { year = 2010, name = "ddd" });
pSc.Add(new school() { year = 2012, name = "fff" });

var res = from t1 in pSc
     from t2 in pSt
    where t1.year == t2.year
    select new {year = t1.year, name = t1.name + t2.name};

foreach (var item in res)
{
    Console.Write("年:" + item.year + "姓名:" + item.name);
    Console.WriteLine();
}

運行結(jié)果:

并行l(wèi)inq

并行查詢可以分解查詢的工作,使其分布在多個線程上。當(dāng)pc擁有多個cpu時,可以看到并行查詢帶來的改進(jìn)效果。并行LINQ適用于大型的集合查詢,并擁有一定的優(yōu)勢。使用System.Collections.Concurrent.Partitioner.Create可以手動創(chuàng)建分區(qū)器??梢源拄?shù)恼J(rèn)為并行l(wèi)inq對于大集合的查詢是優(yōu)勢比較明顯的。取消長時間運行的并行l(wèi)inq查詢可以設(shè)置利用System.Threading.CancellationTokenSource設(shè)置取消操作。

Console.WriteLine("開始構(gòu)造大數(shù)組...");
//構(gòu)造大數(shù)組
const int count = 100000000;
var data = new int[count];
var r = new Random();
for (int i = 0; i < count; i++)
{
    data[i] = r.Next(40);
}
Console.WriteLine("開始計算...");
var st = System.DateTime.Now;
var sum = (from x in data where x > 20 select x).Sum();//常規(guī)linq-耗時1.8641s
var st2 = System.DateTime.Now;
var sum2 = (from x2 in data.AsParallel() where x2 > 20 select x2).Sum();//并行查詢-耗時0.6620s

 //var sum3 = data.AsParallel().Where(x3 => x3 > 20).Sum();//或并行查詢----x3 => x3 > 20(Lambda表達(dá)式)
var st3 = System.DateTime.Now;

 /*Partitioner.Create
手動創(chuàng)建分區(qū)器以及終止LINQ查詢的方法可以詳見文初的博客鏈接
 Create具有多個重載,可依據(jù)需求進(jìn)行分區(qū)*/

var sum4 = (from c in System.Collections.Concurrent.Partitioner.Create(data, true).AsParallel() where c > 20 select c).Sum();

var dt1 = st2 - st;
var dt2 = st3 - st2;
Console.WriteLine("常規(guī)linq耗時:{0}s", dt1.TotalSeconds.ToString());
Console.WriteLine("并行l(wèi)inq耗時:{0}s", dt2.TotalSeconds.ToString());
Console.ReadKey();

運行結(jié)果:

寫在最后,如果你對以上LINQ以及對應(yīng)的Lambda的使用方法都已經(jīng)了解那你已經(jīng)初步了解了LINQ查詢表達(dá)式和Lambda表達(dá)式,這里需要說明的一點是關(guān)于Lambda的使用方法并不僅僅只限于進(jìn)行查詢,他是一個主要用于簡化委托的代碼編寫形式,他用法遠(yuǎn)比文中介紹的更加廣泛,本文是為了對比展現(xiàn)LINQ和Lambda。

以上就是C# LINQ查詢表達(dá)式及對應(yīng)LAMBDA表達(dá)式的用法的詳細(xì)內(nèi)容,更多關(guān)于C# LINQ查詢表達(dá)式及LAMBDA表達(dá)式的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 用C#對ADO.NET數(shù)據(jù)庫完成簡單操作的方法

    用C#對ADO.NET數(shù)據(jù)庫完成簡單操作的方法

    用C#對ADO.NET數(shù)據(jù)庫完成簡單操作的方法...
    2007-03-03
  • C#調(diào)用Python程序傳參數(shù)獲得返回值

    C#調(diào)用Python程序傳參數(shù)獲得返回值

    C# 調(diào)用 Python 程序有多種方式,本文主要介紹了4種方式,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C# 獲取數(shù)據(jù)庫中所有表名、列名的示例代碼

    C# 獲取數(shù)據(jù)庫中所有表名、列名的示例代碼

    這篇文章主要介紹了C# 獲取數(shù)據(jù)庫中所有表名、列名,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • 通過C#和RTSPClient實現(xiàn)簡易音視頻解碼功能

    通過C#和RTSPClient實現(xiàn)簡易音視頻解碼功能

    在多媒體應(yīng)用中,實時傳輸協(xié)議(RTSP)用于流媒體服務(wù),特別是音視頻?監(jiān)控系統(tǒng),通過?C#?和?RTSPClient?庫,可以輕松實現(xiàn)簡易的音視頻解碼和播放功能,本文將詳細(xì)介紹如何使用?C#?和?RTSPClient?構(gòu)建一個簡易但高效的音視頻解碼器,需要的朋友可以參考下
    2024-12-12
  • 實例解析C#設(shè)計模式編程中簡單工廠模式的使用

    實例解析C#設(shè)計模式編程中簡單工廠模式的使用

    這篇文章主要介紹了C#設(shè)計模式編程中簡單工廠模式的使用,文中也舉了在.NET框架下簡單工廠模式的實現(xiàn)例子,需要的朋友可以參考下
    2016-02-02
  • 詳解WMI RPC 服務(wù)器不可用的解決方案

    詳解WMI RPC 服務(wù)器不可用的解決方案

    這篇文章主要介紹了詳解WMI RPC 服務(wù)器不可用的解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • C# 實現(xiàn)顏色的梯度漸變案例

    C# 實現(xiàn)顏色的梯度漸變案例

    這篇文章主要介紹了C# 實現(xiàn)顏色的梯度漸變案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • C#強制轉(zhuǎn)換和嘗試轉(zhuǎn)換的方法

    C#強制轉(zhuǎn)換和嘗試轉(zhuǎn)換的方法

    這篇文章主要為大家詳細(xì)介紹了C#強制轉(zhuǎn)換和嘗試轉(zhuǎn)換的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • c#進(jìn)程之間對象傳遞方法

    c#進(jìn)程之間對象傳遞方法

    本文主要介紹了c#進(jìn)程之間對象傳遞的方法。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • c#注冊表操作類分享

    c#注冊表操作類分享

    這篇文章主要介紹了c#注冊表操作類,主要包括創(chuàng)建注冊表項、讀取注冊表項、判斷注冊表項是否存在、刪除注冊表項、創(chuàng)建注冊表鍵值 、讀取注冊表鍵值、判斷注冊表鍵值是否存在、刪除注冊表鍵值等功能,需要的朋友可以參考下
    2014-03-03

最新評論

宁夏| 峨山| 柘城县| 泰顺县| 留坝县| 哈密市| 鸡东县| 长岭县| 浦北县| 上林县| 烟台市| 麻江县| 渭源县| 甘德县| 建水县| 平安县| 克拉玛依市| 通榆县| 肃宁县| 吴旗县| 南阳市| 贵溪市| 崇明县| 克拉玛依市| 新闻| 易门县| 大田县| 宿迁市| 手机| 通江县| 乌拉特后旗| 黄石市| 河西区| 西吉县| 湘潭县| 读书| 江永县| 阿拉善左旗| 黄陵县| 德兴市| 沙河市|