• 2.3 LINQ


    2.3 LINQ

    实现了IEnumerable接口的类都可以使用LINQ中的方法。

    数据过滤 where()

    IEnumerable<Employee> list1 = list.Where(e => e.Salary > 2500 && e.Age < 35);
    foreach (Employee e in list1)
    {
        Console.WriteLine(e);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    获取数据条数 count()

    int count1 = list.Count(e => e.Salary > 5000 || e.Age < 30);
    int count2 = list.Where(e => e.Salary > 5000 || e.Age < 30).Count();
    
    • 1
    • 2

    至少一条满足条件的数据Any()

    //只要有符合的数据就停止
    bool b1 = list.Any(e => e.Salary > 8000);
    bool b2 = list.Where(e => e.Salary > 8000).Any();
    
    • 1
    • 2
    • 3

    获取一条数据Single、SingleOrDefault、First、FirstOrDefault

    方法解释
    Single有且只有一条数据,如果没有数据或者数据大于1,则报错
    SingleOrDefault最多只有一条数据,如果没有数据,则返回类型默认值,如果多余1条,则报错
    First有一条或多条,则返回第一个,无数据则报错
    FirstOrDefault有数据,则返回第一个,否则返回了类型默认值
    Employee e1 = list.Single(e => e.Id == 6);
    Console.WriteLine(e1);
    Employee? e2 = list.SingleOrDefault(e => e.Id == 9);
    if (e2 == null)
    {
        Console.WriteLine("没有Id==9的数据");
    }
    else
    {
        Console.WriteLine(e2);
    }
    Employee e3 = list.First(e => e.Age > 30);
    Console.WriteLine(e3);
    Employee? e4 = list.FirstOrDefault(e => e.Age > 30);
    if (e4 == null)
    {
        Console.WriteLine("没有大于30岁的数据");
    }
    else
    {
        Console.WriteLine(e2);
    }
    Employee e5 = list.First(e => e.Salary > 9999);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    排序 OrderBy

    var orderedItems1 = list.OrderBy(e => e.Age);//正序
    var orderedItems2 = list.OrderByDescending(e => e.Salary);//倒叙
    
    • 1
    • 2

    限制结果集 Skip

    var orderedItems1 = list.Skip(2).Take(3);
    list.Skip(2);//跳过2条数据
    list.Take(2);//获取list前2条数据
    
    • 1
    • 2
    • 3

    聚合函数 Max、Min、Avg、Sum、Count

    int maxAge = list.Max(e => e.Age);
    long minId = list.Min(e => e.Id);
    int minSalary2 = list.Where(e => e.Age > 30).Min(e => e.Salary);
    
    • 1
    • 2
    • 3

    分组 GroupBy

    返回值为IEnumerable>类型TKey和分组条件表达式类型一致

    IEnumerable<IGrouping<int, Employee>> items = list.GroupBy(e => e.Age);
    foreach (IGrouping<int, Employee> item in items)
    {
        int age = item.Key;
        int count = item.Count();
        int maxSalary = item.Max(e => e.Salary);
        double avgSalary = item.Average(e => e.Salary);
        Console.WriteLine($"年龄{item.Key},人数{count},最高工资{maxSalary},平均工资{avgSalary}");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    投影 select

    IEnumerable<string> names = list.Select(e => e.Gender ? "男" : "女");//将bool转换为男女
    //使用匿名属性
    var items = list.Select(e => new { e.Name, e.Age, XingBie = e.Gender ? "男" : "女" });
    foreach (var item in items)
    {
        string name = item.Name;
        int age = item.Age;
        string xingbie = item.XingBie;
        Console.WriteLine($"名字={name},年龄={age},性别={xingbie}");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    集合转换 ToArray、ToList

    查询语法

    var items2 = from e in list
                where e.Salary > 3000
                orderby e.Age
                select new { e.Name, e.Age, Gender = e.Gender ? "男" : "女" };
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    2023年香港专才计划(输入内地人才计划)拿身份最新申请攻略!
    C# 静态构造函数未执行 .net core框架
    计算机毕业设计Python+djang的疫情数据可视化分析系统(源码+系统+mysql数据库+Lw文档)
    Leetcode290. 单词规律
    如何扫描到最新可用的http代理ip?
    用于发票处理的 DocuWare,摆脱纸张和数据输入的束缚,自动处理所有收到的发票
    微信支付后页面跳转
    Redis缓存问题二、缓存雪崩
    Vue3 使用 Event Bus
    大数据学习笔记1.3 Linux用户操作
  • 原文地址:https://blog.csdn.net/weixin_44064908/article/details/126246211