c#中查詢表達式GroupBy的使用方法
說明:
c#中實現(xiàn)IEnumerable<T>接口的類提供了很多擴展方法,其中Select,Where等為最常見的,且?guī)缀鹾蚐ql語法類似比較好理解,基本滿足了日常處理集合的大部分需求,然而還有一部分稍有不一樣理解起來比較拗,實際分析一下實現(xiàn)的原理倒也很好理解,本篇文章介紹一下GroupBy的使用方法。
實驗基礎數(shù)據(jù)用例:
Student類:
public class Student
{
public int StuId { get; set; }
public string ClassName { get; set; }
public string StudentName { get; set; }
}
設定數(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},
};
我們假設兩個班里的學生總共有六名,現(xiàn)在根據(jù)班級分組
IEnumerable<IGrouping<string, Student>> studentGroup = studentList.GroupBy(s => s.ClassName);
如代碼,調(diào)用GroupBy擴展方法后,返回類型為IEnumerable<IGrouping<string, Student>>, IEnumerable代表了返回結(jié)果可被foreach遍歷,其中泛型實現(xiàn)為IGrouping<string,Student>,按照普遍理解的分組的概念,可以推斷IGrouping中應該是string代表的是一個key,即ClassName,那么key對應的應該就是一個Student的集合,但是代碼應該怎樣實現(xiàn)呢?
可以首先foreach一下studentGroup
foreach (IGrouping<string, Student> item in studentGroup)
{
}
這時候可以item.一下看看提示信息

這時候發(fā)現(xiàn),只能提示出來的屬性只有一個key,那么怎樣通過item獲取到分組后的Student集合呢?這時候發(fā)現(xiàn)第二個GetEnumerator()方法,這個說明了item是可以被foreach的,類型為IEnumerator<Student>,說明了可被遍歷的類型為Student
然后可以foreach下item試一試

如果所示,果然是Student,根據(jù)推斷,現(xiàn)在在foreach中遍歷所有數(shù)據(jù),然后打出來看一下
foreach (IGrouping<string, Student> item in studentGroup)
{
Console.WriteLine(item.Key);
foreach (var student in item)
{
Console.WriteLine(student.StudentName);
}
}
執(zhí)行結(jié)果如下:

所以可以斷定item是一個Student的集合,那么為什么item還有個key屬性呢,好像是和平常的集合不太一樣,事實確實是不一樣的,我們看下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是作為自己的屬性來存儲了,TElement則實現(xiàn)了IEnumerable<TElement>,所以調(diào)用foreach遍歷IGrouping的時候返回的即是Student的集合了
這個探索是挺有趣的,通過神器vs的智能提示和源碼的實現(xiàn)最終知道了GroupBy的用法,并且了解了為什么這樣用。
同時也看出了通過接口可以巧妙的實現(xiàn)多態(tài),其中自然是妙趣無窮!
到此這篇關于c#中查詢表達式GroupBy的使用的文章就介紹到這了,更多相關c#查詢表達式GroupBy使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
winform 調(diào)用攝像頭掃碼識別二維碼的實現(xiàn)步驟
這篇文章主要介紹了winform 調(diào)用攝像頭掃碼識別二維碼的實現(xiàn)步驟,幫助大家更好的理解和學習使用winform,感興趣的朋友可以了解下2021-02-02
C#中使用FilleStream實現(xiàn)視頻文件的復制功能
這篇文章主要介紹了C#中使用FilleStream實現(xiàn)視頻文件的復制功能,本文通過實例代碼給大家介紹的非常想詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09

