生活随笔
收集整理的這篇文章主要介紹了
转载Linq中GroupBy方法的使用总结
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Group在SQL經(jīng)常使用,通常是對(duì)一個(gè)字段或者多個(gè)字段分組,求其總和,均值等。
Linq中的Groupby方法也有這種功能。具體實(shí)現(xiàn)看代碼:
假設(shè)有如下的一個(gè)數(shù)據(jù)集:
public?class?StudentScore?????{?????????public?int?ID?{?set;?get;?}?????????public?string?Name?{?set;?get;?}?????????public?string?Course?{?set;?get;?}?????????public?int?Score?{?set;?get;?}?????????public?string?Term?{?set;?get;?}?????}?List<StudentScore>?lst?=?new?List<StudentScore>()?{?????????????????new?StudentScore(){ID=1,Name="張三",Term="第一學(xué)期",Course="Math",Score=80},?????????????????new?StudentScore(){ID=1,Name="張三",Term="第一學(xué)期",Course="Chinese",Score=90},?????????????????new?StudentScore(){ID=1,Name="張三",Term="第一學(xué)期",Course="English",Score=70},?????????????????new?StudentScore(){ID=2,Name="李四",Term="第一學(xué)期",Course="Math",Score=60},?????????????????new?StudentScore(){ID=2,Name="李四",Term="第一學(xué)期",Course="Chinese",Score=70},?????????????????new?StudentScore(){ID=2,Name="李四",Term="第一學(xué)期",Course="English",Score=30},?????????????????new?StudentScore(){ID=3,Name="王五",Term="第一學(xué)期",Course="Math",Score=100},?????????????????new?StudentScore(){ID=3,Name="王五",Term="第一學(xué)期",Course="Chinese",Score=80},?????????????????new?StudentScore(){ID=3,Name="王五",Term="第一學(xué)期",Course="English",Score=80},?????????????????new?StudentScore(){ID=4,Name="趙六",Term="第一學(xué)期",Course="Math",Score=90},?????????????????new?StudentScore(){ID=4,Name="趙六",Term="第一學(xué)期",Course="Chinese",Score=80},?????????????????new?StudentScore(){ID=4,Name="趙六",Term="第一學(xué)期",Course="English",Score=70},?????????????????new?StudentScore(){ID=1,Name="張三",Term="第二學(xué)期",Course="Math",Score=100},?????????????????new?StudentScore(){ID=1,Name="張三",Term="第二學(xué)期",Course="Chinese",Score=80},?????????????????new?StudentScore(){ID=1,Name="張三",Term="第二學(xué)期",Course="English",Score=70},?????????????????new?StudentScore(){ID=2,Name="李四",Term="第二學(xué)期",Course="Math",Score=90},?????????????????new?StudentScore(){ID=2,Name="李四",Term="第二學(xué)期",Course="Chinese",Score=50},?????????????????new?StudentScore(){ID=2,Name="李四",Term="第二學(xué)期",Course="English",Score=80},?????????????????new?StudentScore(){ID=3,Name="王五",Term="第二學(xué)期",Course="Math",Score=90},?????????????????new?StudentScore(){ID=3,Name="王五",Term="第二學(xué)期",Course="Chinese",Score=70},?????????????????new?StudentScore(){ID=3,Name="王五",Term="第二學(xué)期",Course="English",Score=80},?????????????????new?StudentScore(){ID=4,Name="趙六",Term="第二學(xué)期",Course="Math",Score=70},?????????????????new?StudentScore(){ID=4,Name="趙六",Term="第二學(xué)期",Course="Chinese",Score=60},?????????????????new?StudentScore(){ID=4,Name="趙六",Term="第二學(xué)期",Course="English",Score=70},?????????????};?可以把這個(gè)數(shù)據(jù)集想象成數(shù)據(jù)庫中的一個(gè)二維表格。
示例一
通常我們會(huì)把分組后得到的數(shù)據(jù)放到匿名對(duì)象中,因?yàn)榉纸M后的數(shù)據(jù)的列不一定和原始二維表格的一致。當(dāng)然要按照原有數(shù)據(jù)的格式存放也是可以的,只需select的時(shí)候采用相應(yīng)的類型即可。
第一種寫法很簡(jiǎn)單,只是根據(jù)下面分組。?
??Console.WriteLine("---------第一種寫法");?var?studentSumScore_1?=?(from?l?in?lst??????????????????????????group?l?by?l.Name?into?grouped??????????????????????????orderby?grouped.Sum(m?=>?m.Score)??????????????????????????select?new?{?Name?=?grouped.Key,?Scores?=?grouped.Sum(m?=>?m.Score)?}).ToList();?foreach?(var?l?in?studentSumScore_1)?{?????Console.WriteLine("{0}:總分{1}",?l.Name,?l.Scores);?}?第二種寫法和第一種其實(shí)是等價(jià)的。??Console.WriteLine("---------第二種寫法");?var?studentSumScore_2?=?lst.GroupBy(m?=>?m.Name)?????.Select(k?=>?new?{?Name?=?k.Key,?Scores?=?k.Sum(l?=>?l.Score)?})?????.OrderBy(m?=>?m.Scores).ToList();?foreach?(var?l?in?studentSumScore_2)?{?????Console.WriteLine("{0}:總分{1}",?l.Name,?l.Scores);?}??
示例二
當(dāng)分組的字段是多個(gè)的時(shí)候,通常把這多個(gè)字段合并成一個(gè)匿名對(duì)象,然后group by這個(gè)匿名對(duì)象。
注意:groupby后將數(shù)據(jù)放到grouped這個(gè)變量中,grouped 其實(shí)是IGrouping<TKey, TElement>類型的,IGrouping<out TKey, out TElement>繼承了IEnumerable<TElement>,并且多了一個(gè)屬性就是Key,這個(gè)Key就是當(dāng)初分組的關(guān)鍵字,即那些值都相同的字段,此處就是該匿名對(duì)象。可以在后續(xù)的代碼中取得這個(gè)Key,便于我們編程。
orderby多個(gè)字段的時(shí)候,在SQL中是用逗號(hào)分割多個(gè)字段,在Linq中就直接多寫幾個(gè)orderby。
?Console.WriteLine("---------第一種寫法");?var?TermAvgScore_1?=?(from?l?in?lst???????????????????????group?l?by?new?{?Term?=?l.Term,?Course?=?l.Course?}?into?grouped???????????????????????orderby?grouped.Average(m?=>?m.Score)?ascending???????????????????????orderby?grouped.Key.Term?descending???????????????????????select?new?{?Term?=?grouped.Key.Term,?Course?=?grouped.Key.Course,?Scores?=?grouped.Average(m?=>?m.Score)?}).ToList();?foreach?(var?l?in?TermAvgScore_1)?{?????Console.WriteLine("學(xué)期:{0},課程{1},均分{2}",?l.Term,?l.Course,?l.Scores);?}?Console.WriteLine("---------第二種寫法");?var?TermAvgScore_2?=?lst.GroupBy(m?=>?new?{?Term?=?m.Term,?Course?=?m.Course?})?????.Select(k?=>?new?{?Term?=?k.Key.Term,?Course?=?k.Key.Course,?Scores?=?k.Average(m?=>?m.Score)?})?????.OrderBy(l?=>?l.Scores).OrderByDescending(l?=>?l.Term);?foreach?(var?l?in?TermAvgScore_2)?{?????Console.WriteLine("學(xué)期:{0},課程{1},均分{2}",?l.Term,?l.Course,?l.Scores);?}? 示例三
Linq中沒有SQL中的Having語句,因此是采用where語句對(duì)Group后的結(jié)果過濾。?
?Console.WriteLine("---------第一種寫法");?var?AvgScoreGreater80_1?=?(from?l?in?lst???????????????????group?l?by?new?{?Name?=?l.Name,?Term?=?l.Term?}?into?grouped???????????????????where?grouped.Average(m?=>?m.Score)>=80???????????????????orderby?grouped.Average(m?=>?m.Score)?descending???????????????????select?new?{?Name?=?grouped.Key.Name,?Term?=?grouped.Key.Term,?Scores?=?grouped.Average(m?=>?m.Score)?}).ToList();?foreach?(var?l?in?AvgScoreGreater80_1)?{?????Console.WriteLine("姓名:{0},學(xué)期{1},均分{2}",?l.Name,?l.Term,?l.Scores);?}?Console.WriteLine("---------第二種寫法");??var?AvgScoreGreater80_2?=?lst.GroupBy(l?=>?new?{?Name?=?l.Name,?Term?=?l.Term?})?????.Where(m?=>?m.Average(x?=>?x.Score)?>=?80)?????.OrderByDescending(l=>l.Average(x=>x.Score))?????.Select(l?=>?new?{?Name?=?l.Key.Name,?Term?=?l.Key.Term,?Scores?=?l.Average(m?=>?m.Score)?}).ToList();?foreach?(var?l?in?AvgScoreGreater80_2)?{?????Console.WriteLine("姓名:{0},學(xué)期{1},均分{2}",?l.Name,?l.Term,?l.Scores);?}?? ?
轉(zhuǎn)載于:https://www.cnblogs.com/wphl-27/p/3480167.html
總結(jié)
以上是生活随笔為你收集整理的转载Linq中GroupBy方法的使用总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。