Linq中GroupBy方法的使用总结.docx

上传人:wux****ua 文档编号:8869125 上传时间:2020-04-01 格式:DOCX 页数:5 大小:77.12KB
返回 下载 相关 举报
Linq中GroupBy方法的使用总结.docx_第1页
第1页 / 共5页
Linq中GroupBy方法的使用总结.docx_第2页
第2页 / 共5页
Linq中GroupBy方法的使用总结.docx_第3页
第3页 / 共5页
点击查看更多>>
资源描述
Linq中GroupBy方法的使用总结Group在SQL经常使用,通常是对一个字段或者多个字段分组,求其总和,均值等。Linq中的Groupby方法也有这种功能。具体实现看代码:假设有如下的一个数据集:1. publicclassStudentScore2. 3. publicintIDset;get;4. publicstringNameset;get;5. publicstringCourseset;get;6. publicintScoreset;get;7. publicstringTermset;get;8. 9. Listlst=newList()10. newStudentScore()ID=1,Name=张三,Term=第一学期,Course=Math,Score=80,11. newStudentScore()ID=1,Name=张三,Term=第一学期,Course=Chinese,Score=90,12. newStudentScore()ID=1,Name=张三,Term=第一学期,Course=English,Score=70,13. newStudentScore()ID=2,Name=李四,Term=第一学期,Course=Math,Score=60,14. newStudentScore()ID=2,Name=李四,Term=第一学期,Course=Chinese,Score=70,15. newStudentScore()ID=2,Name=李四,Term=第一学期,Course=English,Score=30,16. newStudentScore()ID=3,Name=王五,Term=第一学期,Course=Math,Score=100,17. newStudentScore()ID=3,Name=王五,Term=第一学期,Course=Chinese,Score=80,18. newStudentScore()ID=3,Name=王五,Term=第一学期,Course=English,Score=80,19. newStudentScore()ID=4,Name=赵六,Term=第一学期,Course=Math,Score=90,20. newStudentScore()ID=4,Name=赵六,Term=第一学期,Course=Chinese,Score=80,21. newStudentScore()ID=4,Name=赵六,Term=第一学期,Course=English,Score=70,22. newStudentScore()ID=1,Name=张三,Term=第二学期,Course=Math,Score=100,23. newStudentScore()ID=1,Name=张三,Term=第二学期,Course=Chinese,Score=80,24. newStudentScore()ID=1,Name=张三,Term=第二学期,Course=English,Score=70,25. newStudentScore()ID=2,Name=李四,Term=第二学期,Course=Math,Score=90,26. newStudentScore()ID=2,Name=李四,Term=第二学期,Course=Chinese,Score=50,27. newStudentScore()ID=2,Name=李四,Term=第二学期,Course=English,Score=80,28. newStudentScore()ID=3,Name=王五,Term=第二学期,Course=Math,Score=90,29. newStudentScore()ID=3,Name=王五,Term=第二学期,Course=Chinese,Score=70,30. newStudentScore()ID=3,Name=王五,Term=第二学期,Course=English,Score=80,31. newStudentScore()ID=4,Name=赵六,Term=第二学期,Course=Math,Score=70,32. newStudentScore()ID=4,Name=赵六,Term=第二学期,Course=Chinese,Score=60,33. newStudentScore()ID=4,Name=赵六,Term=第二学期,Course=English,Score=70,34. ;可以把这个数据集想象成数据库中的一个二维表格。示例一通常我们会把分组后得到的数据放到匿名对象中,因为分组后的数据的列不一定和原始二维表格的一致。当然要按照原有数据的格式存放也是可以的,只需select的时候采用相应的类型即可。第一种写法很简单,只是根据下面分组。1. /分组,根据姓名,统计Sum的分数,统计结果放在匿名对象中。两种写法。2. /第一种写法3. Console.WriteLine(-第一种写法);4. varstudentSumScore_1=(fromlinlst5. grouplbyl.Nameintogrouped6. orderbygrouped.Sum(m=m.Score)7. selectnewName=grouped.Key,Scores=grouped.Sum(m=m.Score).ToList();8. foreach(varlinstudentSumScore_1)9. 10. Console.WriteLine(0:总分1,l.Name,l.Scores);11. 12. 第二种写法和第一种其实是等价的。13. /第二种写法14. Console.WriteLine(-第二种写法);15. varstudentSumScore_2=lst.GroupBy(m=m.Name)16. .Select(k=newName=k.Key,Scores=k.Sum(l=l.Score)17. .OrderBy(m=m.Scores).ToList();18. foreach(varlinstudentSumScore_2)19. 20. Console.WriteLine(0:总分1,l.Name,l.Scores);21. 示例二当分组的字段是多个的时候,通常把这多个字段合并成一个匿名对象,然后group by这个匿名对象。注意:groupby后将数据放到grouped这个变量中,grouped 其实是IGrouping类型的,IGrouping继承了IEnumerable,并且多了一个属性就是Key,这个Key就是当初分组的关键字,即那些值都相同的字段,此处就是该匿名对象。可以在后续的代码中取得这个Key,便于我们编程。orderby多个字段的时候,在SQL中是用逗号分割多个字段,在Linq中就直接多写几个orderby。1. /分组,根据2个条件学期和课程,统计各科均分,统计结果放在匿名对象中。两种写法。2. Console.WriteLine(-第一种写法);3. varTermAvgScore_1=(fromlinlst4. grouplbynewTerm=l.Term,Course=l.Courseintogrouped5. orderbygrouped.Average(m=m.Score)ascending6. orderbygrouped.Key.Termdescending7. selectnewTerm=grouped.Key.Term,Course=grouped.Key.Course,Scores=grouped.Average(m=m.Score).ToList();8. foreach(varlinTermAvgScore_1)9. 10. Console.WriteLine(学期:0,课程1,均分2,l.Term,l.Course,l.Scores);11. 12. Console.WriteLine(-第二种写法);13. varTermAvgScore_2=lst.GroupBy(m=newTerm=m.Term,Course=m.Course)14. .Select(k=newTerm=k.Key.Term,Course=k.Key.Course,Scores=k.Average(m=m.Score)15. .OrderBy(l=l.Scores).OrderByDescending(l=l.Term);16. foreach(varlinTermAvgScore_2)17. 18. Console.WriteLine(学期:0,课程1,均分2,l.Term,l.Course,l.Scores);19. 示例三Linq中没有SQL中的Having语句,因此是采用where语句对Group后的结果过滤。1. /分组,带有Having的查询,查询均分80的学生2. Console.WriteLine(-第一种写法);3. varAvgScoreGreater80_1=(fromlinlst4. grouplbynewName=l.Name,Term=l.Termintogrouped5. wheregrouped.Average(m=m.Score)=806. orderbygrouped.Average(m=m.Score)descending7. selectnewName=grouped.Key.Name,Term=grouped.Key.Term,Scores=grouped.Average(m=m.Score).ToList();8. foreach(varlinAvgScoreGreater80_1)9. 10. Console.WriteLine(姓名:0,学期1,均分2,l.Name,l.Term,l.Scores);11. 12. Console.WriteLine(-第二种写法);13. /此写法看起来较为复杂,第一个Groupby,由于是要对多个字段分组的,因此构建一个匿名对象,14. 对这个匿名对象分组,分组得到的其实是一个IEnumberableIGrouping这样一个类型。15. Where方法接受,和返回的都同样是IEnumberableIGrouping类型,16. 其中Where方法签名Func委托的类型也就成了FuncIGrouping,bool,17. 之前说到,IGrouping继承了IEnumerable,18. 因此这种类型可以有Average,Sum等方法。19. varAvgScoreGreater80_2=lst.GroupBy(l=newName=l.Name,Term=l.Term)20. .Where(m=m.Average(x=x.Score)=80)21. .OrderByDescending(l=l.Average(x=x.Score)22. .Select(l=newName=l.Key.Name,Term=l.Key.Term,Scores=l.Average(m=m.Score).ToList();23. foreach(varlinAvgScoreGreater80_2)24. 25. Console.WriteLine(姓名:0,学期1,均分2,l.Name,l.Term,l.Scores);26. 本文由http:/www.focustar.net 整理分享
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!