c#中查詢(xún)表達(dá)式GroupBy的使用方法
說(shuō)明:
c#中實(shí)現(xiàn)IEnumerable<T>接口的類(lèi)提供了很多擴(kuò)展方法,其中Select,Where等為最常見(jiàn)的,且?guī)缀鹾蚐ql語(yǔ)法類(lèi)似比較好理解,基本滿(mǎn)足了日常處理集合的大部分需求,然而還有一部分稍有不一樣理解起來(lái)比較拗,實(shí)際分析一下實(shí)現(xiàn)的原理倒也很好理解,本篇文章介紹一下GroupBy的使用方法。
實(shí)驗(yàn)基礎(chǔ)數(shù)據(jù)用例:
Student類(lèi):
public class Student { public int StuId { get; set; } public string ClassName { get; set; } public string StudentName { get; set; } }
設(shè)定數(shù)據(jù)如下:
List<Student> studentList = new List<Student> { new Student {ClassName = "軟工一班", StudentName = "康巴一", StuId = 1}, new Student {ClassName = "軟工一班", StudentName = "康巴二", StuId = 2}, new Student {ClassName = "軟工一班", StudentName = "康巴三", StuId = 3}, new Student {ClassName = "軟工二班", StudentName = "康定一", StuId = 4}, new Student {ClassName = "軟工二班", StudentName = "康定二", StuId = 5}, new Student {ClassName = "軟工二班", StudentName = "康定三", StuId = 6}, };
我們假設(shè)兩個(gè)班里的學(xué)生總共有六名,現(xiàn)在根據(jù)班級(jí)分組
IEnumerable<IGrouping<string, Student>> studentGroup = studentList.GroupBy(s => s.ClassName);
如代碼,調(diào)用GroupBy擴(kuò)展方法后,返回類(lèi)型為IEnumerable<IGrouping<string, Student>>, IEnumerable代表了返回結(jié)果可被foreach遍歷,其中泛型實(shí)現(xiàn)為IGrouping<string,Student>,按照普遍理解的分組的概念,可以推斷IGrouping中應(yīng)該是string代表的是一個(gè)key,即ClassName,那么key對(duì)應(yīng)的應(yīng)該就是一個(gè)Student的集合,但是代碼應(yīng)該怎樣實(shí)現(xiàn)呢?
可以首先f(wàn)oreach一下studentGroup
foreach (IGrouping<string, Student> item in studentGroup) { }
這時(shí)候可以item.一下看看提示信息
這時(shí)候發(fā)現(xiàn),只能提示出來(lái)的屬性只有一個(gè)key,那么怎樣通過(guò)item獲取到分組后的Student集合呢?這時(shí)候發(fā)現(xiàn)第二個(gè)GetEnumerator()方法,這個(gè)說(shuō)明了item是可以被foreach的,類(lèi)型為IEnumerator<Student>,說(shuō)明了可被遍歷的類(lèi)型為Student
然后可以foreach下item試一試
如果所示,果然是Student,根據(jù)推斷,現(xiàn)在在foreach中遍歷所有數(shù)據(jù),然后打出來(lái)看一下
foreach (IGrouping<string, Student> item in studentGroup) { Console.WriteLine(item.Key); foreach (var student in item) { Console.WriteLine(student.StudentName); } }
執(zhí)行結(jié)果如下:
所以可以斷定item是一個(gè)Student的集合,那么為什么item還有個(gè)key屬性呢,好像是和平常的集合不太一樣,事實(shí)確實(shí)是不一樣的,我們看下IGrouping的定義如下:
public interface IGrouping<out TKey, out TElement> : IEnumerable<TElement>, IEnumerable { /// <summary> /// 獲取 <see cref="T:System.Linq.IGrouping`2"/> 的鍵。 /// </summary> /// /// <returns> /// <see cref="T:System.Linq.IGrouping`2"/> 的鍵。 /// </returns> [__DynamicallyInvokable] TKey Key { [__DynamicallyInvokable] get; } }
IGrouping的key是作為自己的屬性來(lái)存儲(chǔ)了,TElement則實(shí)現(xiàn)了IEnumerable<TElement>,所以調(diào)用foreach遍歷IGrouping的時(shí)候返回的即是Student的集合了
這個(gè)探索是挺有趣的,通過(guò)神器vs的智能提示和源碼的實(shí)現(xiàn)最終知道了GroupBy的用法,并且了解了為什么這樣用。
同時(shí)也看出了通過(guò)接口可以巧妙的實(shí)現(xiàn)多態(tài),其中自然是妙趣無(wú)窮!
到此這篇關(guān)于c#中查詢(xún)表達(dá)式GroupBy的使用的文章就介紹到這了,更多相關(guān)c#查詢(xún)表達(dá)式GroupBy使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Winform下實(shí)現(xiàn)圖片切換特效的方法
這篇文章主要介紹了Winform下實(shí)現(xiàn)圖片切換特效的方法,包括百葉窗、淡入、旋轉(zhuǎn)等多種效果,需要的朋友可以參考下2014-08-08c# 實(shí)現(xiàn)子窗口關(guān)閉父窗口也關(guān)閉的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇c# 實(shí)現(xiàn)子窗口關(guān)閉父窗口也關(guān)閉的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02winform 調(diào)用攝像頭掃碼識(shí)別二維碼的實(shí)現(xiàn)步驟
這篇文章主要介紹了winform 調(diào)用攝像頭掃碼識(shí)別二維碼的實(shí)現(xiàn)步驟,幫助大家更好的理解和學(xué)習(xí)使用winform,感興趣的朋友可以了解下2021-02-02C#中使用FilleStream實(shí)現(xiàn)視頻文件的復(fù)制功能
這篇文章主要介紹了C#中使用FilleStream實(shí)現(xiàn)視頻文件的復(fù)制功能,本文通過(guò)實(shí)例代碼給大家介紹的非常想詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09C#實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01