接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();