Linq学习总结3

linq常用扩展方法

定义一个员工信息类

    class Employee
    {
        public long Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public bool Gender { get; set; }
        public int Salary { get; set; }
        public override string ToString()
        {
            return $"id={Id},name={Name},age={Age},gender={Gender},salary={Salary}";
        }
    }

api方法调用:聚合函数使用

        static void Main(string[] args)
        {
            List<Employee> list = new List<Employee>();
            list.Add(new Employee { Id = 1, Name = "zhangsan", Age = 15, Gender = false, Salary = 5000 });
            list.Add(new Employee { Id = 2, Name = "lisi", Age = 50, Gender = true, Salary = 8000 });
            list.Add(new Employee { Id = 3, Name = "wangwu", Age = 30, Gender = false, Salary = 1000 });
            list.Add(new Employee { Id = 4, Name = "zhaoliu", Age = 20, Gender = true, Salary = 3000 });
            list.Add(new Employee { Id = 5, Name = "mazi", Age = 25, Gender = false, Salary = 2000 });
            list.Add(new Employee { Id = 6, Name = "jack", Age = 36, Gender = false, Salary = 6000 });
            list.Add(new Employee { Id = 7, Name = "rose", Age = 20, Gender = false, Salary = 7600 });


            int maxSalary = list.Max(e => e.Salary);//薪资最大值
            Console.WriteLine(maxSalary);

            double minSalary = list.Min(e => e.Salary);//薪资最小值
            Console.WriteLine(minSalary);

            double avgSalary = list.Average(e => e.Salary);//薪资平均值
            Console.WriteLine(avgSalary);

            double listCount = list.Count();//数量
            Console.WriteLine(listCount);


            Console.Read();
        }

执行结果:

linq中所有的扩展方法几乎都是针对IEnumerable接口的,而几乎所有能返回集合的都返回IEnumerable,所以可以把几乎所有方法“链式使用”。例如:

list.Where(e => e.Age > 25).Min(e => e.Salary);//求年龄大于25岁员工的薪资最小值

api方法调用:分组

        static void Main(string[] args)
        {
            List<Employee> list = new List<Employee>();
            list.Add(new Employee { Id = 1, Name = "zhangsan", Age = 15, Gender = false, Salary = 5000 });
            list.Add(new Employee { Id = 2, Name = "lisi", Age = 50, Gender = true, Salary = 8000 });
            list.Add(new Employee { Id = 3, Name = "wangwu", Age = 30, Gender = false, Salary = 1000 });
            list.Add(new Employee { Id = 4, Name = "zhaoliu", Age = 20, Gender = true, Salary = 3000 });
            list.Add(new Employee { Id = 5, Name = "mazi", Age = 25, Gender = false, Salary = 2000 });
            list.Add(new Employee { Id = 6, Name = "jack", Age = 36, Gender = false, Salary = 6000 });
            list.Add(new Employee { Id = 7, Name = "rose", Age = 20, Gender = false, Salary = 7600 });


            //根据年龄分组
            IEnumerable<IGrouping<int, Employee>> sources = list.GroupBy(e => e.Age);
            foreach (IGrouping<int, Employee> group in sources)
            {
                Console.WriteLine(group.Key);
                foreach (var item in group)
                {
                    Console.WriteLine(item);
                }
                Console.WriteLine("*********************");
                Console.WriteLine();
            }


            Console.Read();
        }

执行结果:

GroupBy()方法:参数是分组条件表达式,返回值为IGrouping<TKey, TSource>类型的泛型IEnumerable,也就是每一组以一个IGrouping对象的形式返回。IGrouping是一个继承自IEnumerable的接口,IGrouping中key属性表示这一组的分组数据的值。

例子:根据年龄分组,获取每组人数、最高工资、最低工资、平均工资
 

        static void Main(string[] args)
        {
            List<Employee> list = new List<Employee>();
            list.Add(new Employee { Id = 1, Name = "zhangsan", Age = 15, Gender = false, Salary = 5000 });
            list.Add(new Employee { Id = 2, Name = "lisi", Age = 50, Gender = true, Salary = 8000 });
            list.Add(new Employee { Id = 3, Name = "wangwu", Age = 30, Gender = false, Salary = 1000 });
            list.Add(new Employee { Id = 4, Name = "zhaoliu", Age = 20, Gender = true, Salary = 3000 });
            list.Add(new Employee { Id = 5, Name = "mazi", Age = 25, Gender = false, Salary = 2000 });
            list.Add(new Employee { Id = 6, Name = "jack", Age = 36, Gender = false, Salary = 6000 });
            list.Add(new Employee { Id = 7, Name = "rose", Age = 20, Gender = false, Salary = 7600 });


            //根据年龄分组
            IEnumerable<IGrouping<int, Employee>> sources = list.GroupBy(e => e.Age);
            foreach (IGrouping<int, Employee> group in sources)
            {
                Console.WriteLine("年龄:" + group.Key);
                Console.WriteLine("人数:" + group.Count());
                Console.WriteLine("最高工资:" + group.Max(e => e.Salary));
                Console.WriteLine("最低工资:" + group.Min(e => e.Salary));
                Console.WriteLine("平均工资:" + group.Average(e => e.Salary));

                foreach (var item in group)
                {
                    Console.WriteLine(item);
                }
                Console.WriteLine("*********************");
                Console.WriteLine();
            }

            Console.Read();
        }

执行结果:

api方法调用:投影

        static void Main(string[] args)
        {
            List<Employee> list = new List<Employee>();
            list.Add(new Employee { Id = 1, Name = "zhangsan", Age = 15, Gender = false, Salary = 5000 });
            list.Add(new Employee { Id = 2, Name = "lisi", Age = 50, Gender = true, Salary = 8000 });
            list.Add(new Employee { Id = 3, Name = "wangwu", Age = 30, Gender = false, Salary = 1000 });
            list.Add(new Employee { Id = 4, Name = "zhaoliu", Age = 20, Gender = true, Salary = 3000 });
            list.Add(new Employee { Id = 5, Name = "mazi", Age = 25, Gender = false, Salary = 2000 });
            list.Add(new Employee { Id = 6, Name = "jack", Age = 36, Gender = false, Salary = 6000 });
            list.Add(new Employee { Id = 7, Name = "rose", Age = 20, Gender = false, Salary = 7600 });


            //投影
            IEnumerable<string> ages = list.Select(e => e.Name);
            foreach (var item in ages)
            {
                Console.WriteLine(item);
            }

            Console.Read();
        }

执行结果:

投影指把集合中每一项转换为另外一种类型。它能够选择数据源中的元素,并指定元素的表现形式。

投影(select)和匿名类型(var)结合重新生成新的对象

        static void Main(string[] args)
        {
            List<Employee> list = new List<Employee>();
            list.Add(new Employee { Id = 1, Name = "zhangsan", Age = 15, Gender = false, Salary = 5000 });
            list.Add(new Employee { Id = 2, Name = "lisi", Age = 50, Gender = true, Salary = 8000 });
            list.Add(new Employee { Id = 3, Name = "wangwu", Age = 30, Gender = false, Salary = 1000 });
            list.Add(new Employee { Id = 4, Name = "zhaoliu", Age = 20, Gender = true, Salary = 3000 });
            list.Add(new Employee { Id = 5, Name = "mazi", Age = 25, Gender = false, Salary = 2000 });
            list.Add(new Employee { Id = 6, Name = "jack", Age = 36, Gender = false, Salary = 6000 });
            list.Add(new Employee { Id = 7, Name = "rose", Age = 20, Gender = false, Salary = 7600 });


           //select和var结合
            var newList = list.Select(e => new
            {
                xingming = e.Name,
                nianling = e.Age,
                xinzi = e.Salary
            });
            foreach (var item in newList)
            {
                Console.WriteLine($"{item.xingming} {item.nianling}  {item.xinzi}");
            }

            Console.Read();
        }

执行结果:

 通过select生成一个新的集合,集合中的对象时匿名类。

api方法调用:集合转换

有一些地方需要数组类型或者List类型的变量,可以用ToArray()方法和ToList()方法分别把IEnumerable<T>转换成数组类型和List<T>类型。

示例:

List<Employee> newList = list.Where(e => e.Age > 30).ToList();
Employee[] newArr = list.Where(e => e.Age > 30).ToArray();

综合应用一:求相同年龄的人数,及相同年龄中的最高工资、最低工资。

        static void Main(string[] args)
        {
            List<Employee> list = new List<Employee>();
            list.Add(new Employee { Id = 1, Name = "zhangsan", Age = 15, Gender = false, Salary = 5000 });
            list.Add(new Employee { Id = 2, Name = "lisi", Age = 50, Gender = true, Salary = 8000 });
            list.Add(new Employee { Id = 3, Name = "wangwu", Age = 30, Gender = false, Salary = 1000 });
            list.Add(new Employee { Id = 4, Name = "zhaoliu", Age = 20, Gender = true, Salary = 3000 });
            list.Add(new Employee { Id = 5, Name = "mazi", Age = 25, Gender = false, Salary = 2000 });
            list.Add(new Employee { Id = 6, Name = "jack", Age = 36, Gender = false, Salary = 6000 });
            list.Add(new Employee { Id = 7, Name = "rose", Age = 20, Gender = false, Salary = 7600 });


           //求相同年龄的人数,及相同年龄中的最高工资、最低工资。
            var testList = list.GroupBy(e => e.Age).Select(g => new
            {
                nianling = g.Key,
                renshu = g.Count(),
                maxgz = g.Max(e => e.Salary),
                mingz = g.Min(e => e.Salary)
            });
            foreach (var item in testList)
            {
                Console.WriteLine($"年龄:{item.nianling} 人数:{item.renshu} 最高工资:{item.maxgz} 最低工资:{item.mingz}");
            }
            Console.Read();
        }

执行结果:

 综合应用二:获取ID>2的数据,然后安装age分组,并且把分组按照age排序,然后取前3条,最后再投影取得年龄、人数、平均工资。

        static void Main(string[] args)
        {
            List<Employee> list = new List<Employee>();
            list.Add(new Employee { Id = 1, Name = "zhangsan", Age = 15, Gender = false, Salary = 5000 });
            list.Add(new Employee { Id = 2, Name = "lisi", Age = 50, Gender = true, Salary = 8000 });
            list.Add(new Employee { Id = 3, Name = "wangwu", Age = 30, Gender = false, Salary = 1000 });
            list.Add(new Employee { Id = 4, Name = "zhaoliu", Age = 20, Gender = true, Salary = 3000 });
            list.Add(new Employee { Id = 5, Name = "mazi", Age = 25, Gender = false, Salary = 2000 });
            list.Add(new Employee { Id = 6, Name = "jack", Age = 36, Gender = false, Salary = 6000 });
            list.Add(new Employee { Id = 7, Name = "rose", Age = 20, Gender = false, Salary = 7600 });


            //获取ID>2的数据,然后安装age分组,并且把分组按照age排序,然后取前3条,最后再投影取得年龄、人数、平均工资
            var testList1 = list.Where(e => e.Id > 2).GroupBy(e => e.Age).OrderBy(e => e.Key).Take(3).Select(g => new
            {
                nianling = g.Key,
                renshu = g.Count(),
                pingjungz = g.Average(e => e.Salary)
            });
            foreach (var item in testList1)
            {
                Console.WriteLine($"年龄:{item.nianling} 人数:{item.renshu} 平均工资:{item.pingjungz}");
            }

            Console.Read();
        }

执行结果:

猜你喜欢

转载自blog.csdn.net/liangmengbk/article/details/121305098