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)也可以单独使用。