C#中linq表达式用法的归纳总结(下)

     接C#中linq表达式用法的归纳总结(上),这篇将介绍GroupBy, SelectMany, OrderBy, 常用的聚合操作用法,还有相关的注意事项。

   

   GroupBy用法

     GroupBy的作用是,对序列中的元素进行分组。有这样的一个场景,每个学生都有对应的班级,我需要统计出每个班级的相关人数,如果没有GroupBy子句,逻辑将会比较复杂,需要通过好几次遍历才能得到想要的结果,

有了GroupBy子句之后,可以轻松搞定。

List<Student> students = new List<Student>()
            {
                new Student()
                {
                    Name = "xiaoming",
                    Age = 10,
                    ClassName = "classOne"
                },
                new Student()
                {
                    Name = "xiaohong",
                    Age = 9,
                    ClassName = "classOne"
                },
                new Student()
                {
                    Name = "xiaodong",
                    Age = 16,
                    ClassName = "classTwo"
                }
            };

var result = students.GroupBy(c => c.ClassName).Select(c => new { ClassName = c.Key, Count = c.Count() }); 
result.ToList().ForEach(c => Console.WriteLine("ClassName : " + c.ClassName + " " + "Count : " + c.Count));

// output
// ClassName : classOne Count : 2
// ClassName : classTwo Count : 1

   

   SelectMany用法

   将序列的每个元素投影到 IEnumerable<T> 并将结果序列合并为一个序列。

   还是以班级学生为例,现在有一个班级列表,每个班级底下有一个学生列表,我需要获取到所有班级里的所有学生,并且放在一个列表里。

   如果没有SelectMany子句的话,需要先遍历班级列表,然后再将班级底下的学生列表装填进一个list中

   但是有了SelectMany方法,就是一句话的事

List<Class> classes = new List<Class>()
            {
               new Class()
               {
                  Name = "classOne",
                  Students = new List<Student>(){
                  new Student()
                  {
                     Name = "xiaoming",
                     Age = 10,
                     ClassName = "classOne"
                  },
                  new Student()
                  {
                     Name = "xiaohong",
                     Age = 9,
                     ClassName = "classOne"
                  },
                  new Student()
                  {
                     Name = "xiaodong",
                     Age = 16,
                     ClassName = "classOne"
                  }
                }
               },
               new Class()
               {
                Name = "classTwo",
                Students = new List<Student>(){
                new Student()
                {
                    Name = "student1",
                    Age = 10,
                    ClassName = "classTwo"
                },
                new Student()
                {
                    Name = "student2",
                    Age = 9,
                    ClassName = "classTwo"
                },
                new Student()
                {
                    Name = "student3",
                    Age = 16,
                    ClassName = "classTwo"
                }
               }
             }
           };

List<Student> students = classes.SelectMany(c => c.Students).ToList();

 

  OrderBy用法

   按升序对序列的元素进行排序。

   还是以学生列表为例,根据学生的年龄正序和倒序排列

List<Student> students = new List<Student>()
            {
                new Student()
                {
                    Name = "xiaoming",
                    Age = 10
                },
                new Student()
                {
                    Name = "xiaohong",
                    Age = 9
                },
                new Student()
                {
                    Name = "xiaodong",
                    Age = 16
                }
            };
var list1 = students.OrderBy(c => c.Age).ToList();
var list2 = students.OrderByDescending(c => c.Age).ToList();

  有这样的一个场景,我希望先根据学生的年龄排序,如果学生年龄相同,再根据学生的名字排序,别担心,linq提供了ThenBy和ThenByDescending方法可以完美解决这种场景

var list3 = students.OrderBy(c => c.Age).ThenBy(c => c.Name).ToList();

 

 常用的聚合操作用法

  常用的聚合操作有,Max, Min, Sum, Count, Average,这些操作很简单,一看就懂,需要注意的是list在使用Average方法时,如果list中没有元素,将会报错。

List<int> numberList = new List<int> { 1, 2, 3, 4, 5 };
var sum = numberList.Sum();
var min = numberList.Min();
var max = numberList.Max();
var average = numberList.Average();
var count = numberList.Count();

 

   

  

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值