Linq学习总结2

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 });

            IEnumerable<Employee> newList = list.Where(e => e.Age > 20);
            foreach (Employee item in newList)
            {
                Console.WriteLine(item);
            }

            Console.WriteLine(list.Count());//返回所有记录条数
            Console.WriteLine(list.Count(e => e.Age > 30));//返回满足条件的记录条数
            Console.WriteLine(list.Any(e => e.Salary > 3000));//判断是否存在满足条件的记录 存在返回true,否则返回false

            Console.Read();
        }

执行结果:

where方法:每一项数据都会经过predicate的测试,如果针对每一个元素,predicate执行的返回值为true,那么这个元素就会放到返回值中。

where参数是一个lambda表达式格式的匿名方法,方法的参数e代表当前判断的元素对象。参数的名字不一定非要叫e,不过一般lambda表达式中的变量名长度都不长。

count()方法:获取数据条数。

any()方法:是否至少有一条数据满足条件。

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 });

         
            //Employee e1 = list.Single();//会报错,因为list中有多条记录;如果一条记录都没有也会报错
            Employee e2 = list.Where(e => e.Name == "zhangsan").Single();
            Employee e3 = list.Single(e => e.Name == "zhangsan");
            Console.WriteLine(e2);
            Console.WriteLine(e3);

            Employee e4 = list.SingleOrDefault(e => e.Name == "zhangsan1111");
            Console.WriteLine(e4==null);//true

            //Employee e5 = list.First(e => e.Name == "zhangsan1111");//会报错,因为没有匹配到任何一条;如果有多条则默认为第一条
            //Console.WriteLine(e5);

            Employee e6 = list.FirstOrDefault(e => e.Name == "zhangsan1111");
            Console.WriteLine(e6==null);//true

            Console.Read();
        }

执行结果:

 

Single()方法:有且只有一条满足要求的数据,如果没有或者超过一条都会报异常。

SingleOrDefault()方法:最多只有一条满足要求的数据,如果没有就返回null,如果超过一条就会报异常。

First()方法:返回第一条。如果一条都没有,会报异常;如果有多条则返回第一条。

FirstOrDefault()方法:返回第一条或默认值。如果一条都没有返回默认值,如果有多条返回第一条。

选择合适的方法,起到“防御性编程”的目的。比如说只需要查询一条记录,那就可以使用上面的方法进行查询,尽管结果集中没有记录可能会引发异常。但是及早将问题暴露出来是一个好的事情,防止在后面更为重要的环节当中出错。

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 });

            //根据age正序
            IEnumerable<Employee> listOrder = list.OrderBy(e => e.Age);
            foreach (var item in listOrder)
            {
                Console.WriteLine(item);
            }


            //根据Salary倒序
            IEnumerable<Employee> listSalary = list.OrderByDescending(e => e.Salary);
            foreach (var item in listSalary)
            {
                Console.WriteLine(item);
            }


            Console.Read();
        }

执行结果:

 

 OrderBy()方法:对数据正序排序。

OrderByDescending()方法:对数据倒序排序。

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 });

            IEnumerable<Employee> listSkip = list.Skip(2).Take(3);
            foreach (var item in listSkip)
            {
                Console.WriteLine(item);
            }


            Console.Read();
        }

执行结果:

Skip(n)方法:跳过n条数据。

Take(n)方法:获取n条数据。

Skip(n)、Take(n)也可以单独使用。

猜你喜欢

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