LINQ基礎(chǔ)之From和GroupBy子句
FROM子句
一、簡(jiǎn)單FROM子句
獲取數(shù)據(jù)源:
var queryAllCustomers = from cust in Customers select cust;
分析:
查詢表達(dá)式必須以from子句開(kāi)頭
例子中cust是范圍變量,范圍變量類(lèi)似于foreach循環(huán)中的迭代變量,但在查詢表達(dá)式中,實(shí)際上不發(fā)生迭代。執(zhí)行查詢時(shí),范圍變量將用作對(duì)Customers中的每個(gè)后續(xù)元素的引用。因?yàn)榫幾g器可以推斷cust的類(lèi)型,所以不必顯示指定此類(lèi)型。
Customers是數(shù)據(jù)源,實(shí)現(xiàn)了IEnumerable或IEnumerable(T)或其派生接口的
二、復(fù)合FROM子句
查詢出成績(jī)有90分以上的學(xué)生,得到他們的名字和成績(jī)
//數(shù)據(jù)源 IList<Student> students = new List<Student> { new Student{ Name="Kevin", Score=new List<int>{89,93,88,78}}, new Student{ Name="Jackie",Score=new List<int>{92,87,83,91}}, new Student{ Name="Helen",Score=new List<int>{53,76,72,62}} }; //所有的Linq查詢操作都由以下三個(gè)不同的操作組成: //1.獲得數(shù)據(jù)源 //2.創(chuàng)建查詢 //3.執(zhí)行查詢 //使用復(fù)合from子句查詢命令 var getStudent = from student in students from score in student.Score where score > 90 select new { Name = student.Name, Score = score }; foreach (var st in getStudent) { Console.WriteLine("NAME:{0},SCORE:{1}",st.Name,st.Score); }
分析:
我們可以看到學(xué)生對(duì)象中有個(gè)Score屬性,Score屬性本身就是List集合,這時(shí)候我們就要用到復(fù)合from子句進(jìn)行查詢了。首先遍歷學(xué)生對(duì)象集合中的每個(gè)學(xué)生對(duì)象,然后在用另一個(gè)from子句,對(duì)每個(gè)學(xué)生對(duì)象中的Score屬性進(jìn)行遍歷,篩選出含有90分以上的學(xué)生信息進(jìn)行返回。
GroupBy子句
一、簡(jiǎn)介
group子句返回一個(gè)IGrouping(T Key,T element)對(duì)象序列,編譯時(shí),group子句被轉(zhuǎn)換成對(duì)GroupBy方法的調(diào)用。
二、案例
案例一:
根據(jù)首字母分組,并打印到控制臺(tái)
//數(shù)據(jù)源 string[] fruits = { "apple", "banana", "peach", "orange", "melon", "lemon" }; //分組查詢的查詢語(yǔ)句 var query = from f in fruits group f by f[0]; //執(zhí)行查詢 foreach (var letters in query) { Console.WriteLine("words that start with letter:" + letters.Key); foreach (var word in letters) { Console.WriteLine(word); } }
分析:
首先遍歷字符串?dāng)?shù)組中的每個(gè)字符串,然后根據(jù)每個(gè)字符串的首字母進(jìn)行分組,返回結(jié)果.
案例二:
var query = from f in fruits group f by f[0] into g where g.Key == 'p' || g.Key == 'b' select g;
分析:
如果您想要對(duì)每個(gè)組執(zhí)行附加查詢操作,則可以使用into上下文關(guān)鍵字指定一個(gè)臨時(shí)標(biāo)識(shí)符。使用into時(shí),必須繼續(xù)編寫(xiě)該查詢,并最終用一個(gè)select語(yǔ)句或另一個(gè)group子句結(jié)束該查詢。
案例三:
string[] strs = { "胡廣成", "張國(guó)榮", "劉德華", "故國(guó)冰封", "萬(wàn)里雪飄", "AAA", "胡翰軒", "張杰" }; var list5 = strs //.Where(a => a.Length == 3) .Select(item => item) .GroupBy(item => item.Length);//分組 分組依據(jù)是字符串的長(zhǎng)度 foreach (var item in list5) { Console.WriteLine("----------------"); Console.WriteLine($"分組字段是{item.Key}"); //item.Key是分組依據(jù) 顯示分組字段 foreach (var items in item)//內(nèi)層循環(huán)遍歷分組項(xiàng) { Console.WriteLine(items); } }
分析:
按照名字的長(zhǎng)度進(jìn)行分組顯示。
三、多字段分組示例
GroupBy(x => new { x.a , x.b, x.c }).Select( x=> ( new Class名 { a=x.Key.a , b=x.Key.b , c = x.Key.c } ))
到此這篇關(guān)于LINQ使用From和GroupBy子句的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#中字符串與字節(jié)數(shù)組的轉(zhuǎn)換方式
這篇文章介紹了C#中字符串與字節(jié)數(shù)組的轉(zhuǎn)換方式,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05C#實(shí)現(xiàn)的pdf生成圖片文字水印類(lèi)實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)的pdf生成圖片文字水印類(lèi),結(jié)合完整實(shí)例形式分析了C#針對(duì)pdf文件的創(chuàng)建、添加文字、水印等相關(guān)操作技巧,需要的朋友可以參考下2017-09-09C#實(shí)現(xiàn)按照指定長(zhǎng)度在數(shù)字前補(bǔ)0方法小結(jié)
這篇文章主要介紹了C#實(shí)現(xiàn)按照指定長(zhǎng)度在數(shù)字前補(bǔ)0方法,實(shí)例總結(jié)了兩個(gè)常用的數(shù)字補(bǔ)0的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04Unity實(shí)現(xiàn)新手引導(dǎo)鏤空效果
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)新手引導(dǎo)的鏤空效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02Silverlight實(shí)現(xiàn)跑馬燈動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了Silverlight實(shí)現(xiàn)跑馬燈動(dòng)畫(huà),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07解析C#中[],List,Array,ArrayList的區(qū)別及應(yīng)用
本篇文章主要是對(duì)C#中[],List,Array,ArrayList的區(qū)別及應(yīng)用進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-01-01c# 兩個(gè)數(shù)組比較,將重復(fù)部分去掉,返回不重復(fù)部分的實(shí)現(xiàn)
下面小編就為大家?guī)?lái)一篇c# 兩個(gè)數(shù)組比較,將重復(fù)部分去掉,返回不重復(fù)部分的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12