日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

转载Linq中GroupBy方法的使用总结

發(fā)布時(shí)間:2023/12/18 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转载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ù)下面分組。?

  • //分組,根據(jù)姓名,統(tǒng)計(jì)Sum的分?jǐn)?shù),統(tǒng)計(jì)結(jié)果放在匿名對(duì)象中。兩種寫法。?
  • //第一種寫法?
  • 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。

  • //分組,根據(jù)2個(gè)條件學(xué)期和課程,統(tǒng)計(jì)各科均分,統(tǒng)計(jì)結(jié)果放在匿名對(duì)象中。兩種寫法。?
  • 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é)果過濾。?

  • //分組,帶有Having的查詢,查詢均分>80的學(xué)生?
  • 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("---------第二種寫法");?
  • //此寫法看起來較為復(fù)雜,第一個(gè)Groupby,由于是要對(duì)多個(gè)字段分組的,因此構(gòu)建一個(gè)匿名對(duì)象,
  • 對(duì)這個(gè)匿名對(duì)象分組,分組得到的其實(shí)是一個(gè)IEnumberable<IGrouping<匿名類型,StudentScore>>這樣一個(gè)類型。
  • Where方法接受,和返回的都同樣是IEnumberable<IGrouping<匿名類型,StudentScore>>類型,
  • 其中Where方法簽名Func委托的類型也就成了Func<IGrouping<匿名類型,StudentScore>,bool>,
  • 之前說到,IGrouping<out?TKey,?out?TElement>繼承了IEnumerable<TElement>,
  • 因此這種類型可以有Average,Sum等方法。?
  • 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ò),歡迎將生活随笔推薦給好友。