Linq分组,linq方法分组

Group在SQL经常使用,通常是对一个字段或者多个字段分组,求其总和,均值等。

Linq中的Groupby方法也有这种功能。具体实现看代码:

假设有如下的一个数据集:

view sourceprint?

01.public class StudentScore

02.{

03.public int ID { setget; }

04.public string Name { setget; }

05.public string Course { setget; }

06.public int Score { setget; }

07.public string Term { setget; }

08.}

09.List<StudentScore> lst = new List<StudentScore>() {

10.new StudentScore(){ID=1,Name="张三",Term="第一学期",Course="Math",Score=80},

11.new StudentScore(){ID=1,Name="张三",Term="第一学期",Course="Chinese",Score=90},

12.new StudentScore(){ID=1,Name="张三",Term="第一学期",Course="English",Score=70},

13.new StudentScore(){ID=2,Name="李四",Term="第一学期",Course="Math",Score=60},

14.new StudentScore(){ID=2,Name="李四",Term="第一学期",Course="Chinese",Score=70},

15.new StudentScore(){ID=2,Name="李四",Term="第一学期",Course="English",Score=30},

16.new StudentScore(){ID=3,Name="王五",Term="第一学期",Course="Math",Score=100},

17.new StudentScore(){ID=3,Name="王五",Term="第一学期",Course="Chinese",Score=80},

18.new StudentScore(){ID=3,Name="王五",Term="第一学期",Course="English",Score=80},

19.new StudentScore(){ID=4,Name="赵六",Term="第一学期",Course="Math",Score=90},

20.new StudentScore(){ID=4,Name="赵六",Term="第一学期",Course="Chinese",Score=80},

21.new StudentScore(){ID=4,Name="赵六",Term="第一学期",Course="English",Score=70},

22.new StudentScore(){ID=1,Name="张三",Term="第二学期",Course="Math",Score=100},

23.new StudentScore(){ID=1,Name="张三",Term="第二学期",Course="Chinese",Score=80},

24.new StudentScore(){ID=1,Name="张三",Term="第二学期",Course="English",Score=70},

25.new StudentScore(){ID=2,Name="李四",Term="第二学期",Course="Math",Score=90},

26.new StudentScore(){ID=2,Name="李四",Term="第二学期",Course="Chinese",Score=50},

27.new StudentScore(){ID=2,Name="李四",Term="第二学期",Course="English",Score=80},

28.new StudentScore(){ID=3,Name="王五",Term="第二学期",Course="Math",Score=90},

29.new StudentScore(){ID=3,Name="王五",Term="第二学期",Course="Chinese",Score=70},

30.new StudentScore(){ID=3,Name="王五",Term="第二学期",Course="English",Score=80},

31.new StudentScore(){ID=4,Name="赵六",Term="第二学期",Course="Math",Score=70},

32.new StudentScore(){ID=4,Name="赵六",Term="第二学期",Course="Chinese",Score=60},

33.new StudentScore(){ID=4,Name="赵六",Term="第二学期",Course="English",Score=70},

34.};

可以把这个数据集想象成数据库中的一个二维表格。

示例一

通常我们会把分组后得到的数据放到匿名对象中,因为分组后的数据的列不一定和原始二维表格的一致。当然要按照原有数据的格式存放也是可以的,只需select的时候采用相应的类型即可。

第一种写法很简单,只是根据下面分组。

view sourceprint?

01.//分组,根据姓名,统计Sum的分数,统计结果放在匿名对象中。两种写法。

02.//第一种写法

03.Console.WriteLine("---------第一种写法");

04.var studentSumScore_1 = (from l in lst

05.group l by l.Name into grouped

06.orderby grouped.Sum(m => m.Score)

07.select new { Name = grouped.Key, Scores = grouped.Sum(m => m.Score) }).ToList();

08.foreach (var l in studentSumScore_1)

09.{

10.Console.WriteLine("{0}:总分{1}", l.Name, l.Scores);

11.}

12.第二种写法和第一种其实是等价的。

13.//第二种写法

14.Console.WriteLine("---------第二种写法");

15.var studentSumScore_2 = lst.GroupBy(m => m.Name)

16..Select(k => new { Name = k.Key, Scores = k.Sum(l => l.Score) })

17..OrderBy(m => m.Scores).ToList();

18.foreach (var l in studentSumScore_2)

19.{

20.Console.WriteLine("{0}:总分{1}", l.Name, l.Scores);

21.}

示例二

当分组的字段是多个的时候,通常把这多个字段合并成一个匿名对象,然后group by这个匿名对象。

注意:groupby后将数据放到grouped这个变量中,grouped 其实是IGrouping<TKey, TElement>类型的,IGrouping<out TKey, out TElement>继承了IEnumerable<TElement>,并且多了一个属性就是Key,这个Key就是当初分组的关键字,即那些值都相同的字段,此处就是该匿名对象。可以在后续的代码中取得这个Key,便于我们编程。

orderby多个字段的时候,在SQL中是用逗号分割多个字段,在Linq中就直接多写几个orderby。

view sourceprint?

01.//分组,根据2个条件学期和课程,统计各科均分,统计结果放在匿名对象中。两种写法。

02.Console.WriteLine("---------第一种写法");

03.var TermAvgScore_1 = (from l in lst

04.group l by new { Term = l.Term, Course = l.Course } into grouped

05.orderby grouped.Average(m => m.Score) ascending

06.orderby grouped.Key.Term descending

07.select new { Term = grouped.Key.Term, Course = grouped.Key.Course, Scores = grouped.Average(m => m.Score) }).ToList();

08.foreach (var l in TermAvgScore_1)

09.{

10.Console.WriteLine("学期:{0},课程{1},均分{2}", l.Term, l.Course, l.Scores);

11.}

12.Console.WriteLine("---------第二种写法");

13.var TermAvgScore_2 = lst.GroupBy(m => new { Term = m.Term, Course = m.Course })

14..Select(k => new { Term = k.Key.Term, Course = k.Key.Course, Scores = k.Average(m => m.Score) })

15..OrderBy(l => l.Scores).OrderByDescending(l => l.Term);

16.foreach (var l in TermAvgScore_2)

17.{

18.Console.WriteLine("学期:{0},课程{1},均分{2}", l.Term, l.Course, l.Scores);

19.}

示例三

Linq中没有SQL中的Having语句,因此是采用where语句对Group后的结果过滤。

view sourceprint?

01.//分组,带有Having的查询,查询均分>80的学生

02.Console.WriteLine("---------第一种写法");

03.var AvgScoreGreater80_1 = (from l in lst

04.group l by new { Name = l.Name, Term = l.Term } into grouped

05.where grouped.Average(m => m.Score)>=80

06.orderby grouped.Average(m => m.Score) descending

07.select new { Name = grouped.Key.Name, Term = grouped.Key.Term, Scores = grouped.Average(m => m.Score) }).ToList();

08.foreach (var l in AvgScoreGreater80_1)

09.{

10.Console.WriteLine("姓名:{0},学期{1},均分{2}", l.Name, l.Term, l.Scores);

11.}

12.Console.WriteLine("---------第二种写法");

13.//此写法看起来较为复杂,第一个Groupby,由于是要对多个字段分组的,www.it165.net 因此构建一个匿名对象,

14.对这个匿名对象分组,分组得到的其实是一个IEnumberable<IGrouping<匿名类型,StudentScore>>这样一个类型。

15.Where方法接受,和返回的都同样是IEnumberable<IGrouping<匿名类型,StudentScore>>类型,

16.其中Where方法签名Func委托的类型也就成了Func<IGrouping<匿名类型,StudentScore>,bool>,

17.之前说到,IGrouping<out TKey, out TElement>继承了IEnumerable<TElement>,

18.因此这种类型可以有Average,Sum等方法。

19.var AvgScoreGreater80_2 = lst.GroupBy(l => new { Name = 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 => new { Name = l.Key.Name, Term = l.Key.Term, Scores = l.Average(m => m.Score) }).ToList();

23.foreach (var l in AvgScoreGreater80_2)

24.{

25.Console.WriteLine("姓名:{0},学期{1},均分{2}", l.Name, l.Term, l.Scores);

26.

本文转载自:http://www.it165.net/pro/html/201301/4521.html

时间: 2024-11-04 18:48:00

Linq分组,linq方法分组的相关文章

如何使用linq操作datatable进行分组

使用微软.net的孩子们应该都知道linq吧,要知道linq可是其他高级语言没有的技术,比如php,java等等,但是起初我对linq的认识只是停留在对 list<> 的泛型集合进行操作,要知道操作数据库的,我们比较容易得到的是 datatable,而得到 list<>集合的性能会降低,很多情况下,我们需要对我们的datatable进行操作,很多想到了的对datatable进行逐行或者 逐列进行遍历,但是如果要对datatable进行分组 那就没有办法了,在找了很多资料之后,我发现

[转]Linq中GroupBy方法的使用总结

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 { se

LINQ常用扩展方法

下面的方法都是IEnumerable<T>的扩展方法: Average计算平均值: Min最小元素:Max最大元素:Sum元素总和: Count元素数量: Concat连接两个序列://Unoin all Contains序列是否包含指定元素: Distinct取得序列中的非重复元素: Except获得两个序列的差集: Intersect获得两个序列的交集: First取得序列第一个元素: Single取得序列的唯一一个元素,如果元素个数不是1个,则报错:!!!严谨的程序. FirstOrDe

LinQ 定义扩展方法3.1

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; using System.Diagnostics; namespace ExtensionMethodDump { class Program { static void Main(string[] args) { var song = new { Artist = "Juss

LINQ中ForEach方法的使用

标签: linq 2016-06-25 12:47 409人阅读 评论(0) 收藏 举报 分类: LINQ(5) 我の原创(113) 版权声明:本文为博主原创文章,未经博主允许不得转载. LINQ中ForEach方法的使用. 1.实例一:使用ForEach获取列表中的某个字段值 [csharp] view plain copy 在CODE上查看代码片派生到我的代码片 /// <summary> /// 使用ForEach获取列表中员工名称字段 /// </summary> stat

LINQ与扩展方法

What LinQ是什么? 英文全称Language Integrated Query,中文翻译为语言集成查询.它是一组用于语言的扩展,它通过编写代码以查询数据库相同的方式操作内存数据. LINQ的查询操作是比较有特色也比较常用的,但它也有相关的增删改的操作. Why & How 遍历对象.sql语句用的好好的,为什么又引进LINQ? 或许是初学者,好不容易可以掌握sql语句进行增删改查的操作,或许是被固有的思维绑住,使得我们无法跳出圈子,去审视它的优缺点.sql语句肯定有它的缺点,我们先来看个

sql server——分组查询(方法和思想)

思想 先排序在汇总 sql server里分组查询通常用于配合聚合函数,达到分类汇总统计的信息.而其分类汇总的本质实际上就是先将信息排序,排序后相同类别的信息会聚在一起,然后通过需求进行统计计算. 使用GROUP BY进行分组查询 实例演示 --查询男女生的人数 在没有学习分组查询之前,我们可以安装常规的思路解决查询需求: select count(*) from student where sex='男' select count(*) from student where sex='女' 那

Linq之Linq to Objects

目录 写在前面 系列文章 linq to objects 总结 写在前面 上篇文章介绍了linq的延迟加载特性的相关内容,从这篇文章开始将陆续介绍linq to Objects,linq to xml,linq to sql等内容. 系列文章 Linq之Lambda表达式初步认识 Linq之Lambda进阶 Linq之隐式类型.自动属性.初始化器.匿名类 Linq之扩展方法 Linq之Expression初见 Linq之Expression进阶 Linq之Expression高级篇(常用表达式类

Linq技术四:动态Linq技术 -- Linq.Expressions

前面介绍了Linq的三个方面应用:Linq to SQL, Linq to XML和Linq to Object,这篇介绍一下动态Linq的实现方式及应用场景. 命名空间: System.Linq; System.Linq.Expressions; 应用Linq的时候,我们都知道只需要Lambda表达式就行,但有些场景仅仅只使用Data Model的字段名操作是不够的或者不方便的. 场景1:假设我们需要拼接Where条件进行查询,一种方式可以拼接IQueryable的表达式.但我想像写SQL语句

Linq之Linq to XML

目录 写在前面 系列文章 linq to xml 总结 写在前面 在很多情况下,都可以见到使用xml的影子.例如,在 Web 上,在配置文件.Microsoft Office Word 文件(将word文档另存为xml文件,这也提供了一种通过操作xml,操作word的一种方式)以及数据库中,都可以看到 XML.而linq to xml提供了一种操作xml更便捷的方式. 系列文章 Linq之Lambda表达式初步认识 Linq之Lambda进阶 Linq之隐式类型.自动属性.初始化器.匿名类 Li