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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/18 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转载Linq中GroupBy方法的使用总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Group在SQL經常使用,通常是對一個字段或者多個字段分組,求其總和,均值等。

Linq中的Groupby方法也有這種功能。具體實現看代碼:

假設有如下的一個數據集:

  • 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="第一學期",Course="Math",Score=80},?
  • ????????????????new?StudentScore(){ID=1,Name="張三",Term="第一學期",Course="Chinese",Score=90},?
  • ????????????????new?StudentScore(){ID=1,Name="張三",Term="第一學期",Course="English",Score=70},?
  • ????????????????new?StudentScore(){ID=2,Name="李四",Term="第一學期",Course="Math",Score=60},?
  • ????????????????new?StudentScore(){ID=2,Name="李四",Term="第一學期",Course="Chinese",Score=70},?
  • ????????????????new?StudentScore(){ID=2,Name="李四",Term="第一學期",Course="English",Score=30},?
  • ????????????????new?StudentScore(){ID=3,Name="王五",Term="第一學期",Course="Math",Score=100},?
  • ????????????????new?StudentScore(){ID=3,Name="王五",Term="第一學期",Course="Chinese",Score=80},?
  • ????????????????new?StudentScore(){ID=3,Name="王五",Term="第一學期",Course="English",Score=80},?
  • ????????????????new?StudentScore(){ID=4,Name="趙六",Term="第一學期",Course="Math",Score=90},?
  • ????????????????new?StudentScore(){ID=4,Name="趙六",Term="第一學期",Course="Chinese",Score=80},?
  • ????????????????new?StudentScore(){ID=4,Name="趙六",Term="第一學期",Course="English",Score=70},?
  • ????????????????new?StudentScore(){ID=1,Name="張三",Term="第二學期",Course="Math",Score=100},?
  • ????????????????new?StudentScore(){ID=1,Name="張三",Term="第二學期",Course="Chinese",Score=80},?
  • ????????????????new?StudentScore(){ID=1,Name="張三",Term="第二學期",Course="English",Score=70},?
  • ????????????????new?StudentScore(){ID=2,Name="李四",Term="第二學期",Course="Math",Score=90},?
  • ????????????????new?StudentScore(){ID=2,Name="李四",Term="第二學期",Course="Chinese",Score=50},?
  • ????????????????new?StudentScore(){ID=2,Name="李四",Term="第二學期",Course="English",Score=80},?
  • ????????????????new?StudentScore(){ID=3,Name="王五",Term="第二學期",Course="Math",Score=90},?
  • ????????????????new?StudentScore(){ID=3,Name="王五",Term="第二學期",Course="Chinese",Score=70},?
  • ????????????????new?StudentScore(){ID=3,Name="王五",Term="第二學期",Course="English",Score=80},?
  • ????????????????new?StudentScore(){ID=4,Name="趙六",Term="第二學期",Course="Math",Score=70},?
  • ????????????????new?StudentScore(){ID=4,Name="趙六",Term="第二學期",Course="Chinese",Score=60},?
  • ????????????????new?StudentScore(){ID=4,Name="趙六",Term="第二學期",Course="English",Score=70},?
  • ????????????};?
  • 可以把這個數據集想象成數據庫中的一個二維表格。

    示例一

    通常我們會把分組后得到的數據放到匿名對象中,因為分組后的數據的列不一定和原始二維表格的一致。當然要按照原有數據的格式存放也是可以的,只需select的時候采用相應的類型即可。

    第一種寫法很簡單,只是根據下面分組。?

  • //分組,根據姓名,統計Sum的分數,統計結果放在匿名對象中。兩種寫法。?
  • //第一種寫法?
  • 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);?
  • }?
  • 第二種寫法和第一種其實是等價的。?
  • //第二種寫法?
  • 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);?
  • }?
  • ?

    示例二

    當分組的字段是多個的時候,通常把這多個字段合并成一個匿名對象,然后group by這個匿名對象。

    注意:groupby后將數據放到grouped這個變量中,grouped 其實是IGrouping<TKey, TElement>類型的,IGrouping<out TKey, out TElement>繼承了IEnumerable<TElement>,并且多了一個屬性就是Key,這個Key就是當初分組的關鍵字,即那些值都相同的字段,此處就是該匿名對象。可以在后續的代碼中取得這個Key,便于我們編程。

    orderby多個字段的時候,在SQL中是用逗號分割多個字段,在Linq中就直接多寫幾個orderby。

  • //分組,根據2個條件學期和課程,統計各科均分,統計結果放在匿名對象中。兩種寫法。?
  • 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("學期:{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("學期:{0},課程{1},均分{2}",?l.Term,?l.Course,?l.Scores);?
  • }?
  • 示例三

    Linq中沒有SQL中的Having語句,因此是采用where語句對Group后的結果過濾。?

  • //分組,帶有Having的查詢,查詢均分>80的學生?
  • 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},學期{1},均分{2}",?l.Name,?l.Term,?l.Scores);?
  • }?
  • Console.WriteLine("---------第二種寫法");?
  • //此寫法看起來較為復雜,第一個Groupby,由于是要對多個字段分組的,因此構建一個匿名對象,
  • 對這個匿名對象分組,分組得到的其實是一個IEnumberable<IGrouping<匿名類型,StudentScore>>這樣一個類型。
  • 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},學期{1},均分{2}",?l.Name,?l.Term,?l.Scores);?
  • }??
  • ?

    轉載于:https://www.cnblogs.com/wphl-27/p/3480167.html

    總結

    以上是生活随笔為你收集整理的转载Linq中GroupBy方法的使用总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。