首页 > 其他分享 >Linq 常用扩展方法

Linq 常用扩展方法

时间:2023-09-03 17:57:23浏览次数:35  
标签:Salary 常用 扩展 Age list Linq employee var new

1、使用场景

  • Linq 中提供了大量类似Where的扩展方法,简化了数据处理。
  • 数组、List、Dictionary等都实现了 IEnumerable,所以都可以使用 IEnumerable扩展方法,可以使用 Linq。
  • Linq中所有的扩展方法几乎都是针对IEnumerable接口的,而几乎所有能返回集合的都返回IEnumerable,所以是可以把几乎所有方法“链式使用”

2、扩展方法

  • Where:查询满足条件的内容
    var items1 = list.Where(e => e.Age > 30);//返回IEnumerable
  • Count:查询满足条件的个数
    list.Count();
    list.Count(x => x.Age > 20);
    list.Count(x => x.Age > 20 && x.Salary > 8000);
  • Any:判断是否有一条数据,返回 bool
    bool a = list.Any();//true
    bool b = list.Any(x => x.Salary > 300000);//false
  • Single:有且只有一条满足要求的数据,只能有一条,否则报错
  • SingleOrDefault:最多只有一条满足要求的数据,0个或者1个,多于1个报错
  • First:至少有一条,返回第一条,没有会报错
  • FirstOrDefault:返回第一条或者默认值
    //两种写法都行
    var e1 = list.Single(x => x.Name == "Jerry");
    var e2 = list.Where(x => x.Name == "Jerry").Single();
  • OrderBy:正序排序
    int[] nums = new int[]{3,9,6,4,10,7};
    var nums = nums.OrderBy(i => i);
  • OrderByDescending:倒序排序
    // 根据Name的最后一个字母排序
    var items1 = list.OrderByDescending(e => e.Name[e.Name.Length - 1]);
    // 多规则排序,后面必须使用 ThenBy
    var items2 = list.OrderBy(e=>e.Age).ThenBy(e=>e.Salary); 
    var items3 = list.OrderBy(e=>e.Age).ThenByDescending(e=>e.Salary);
  • Skip(n):跳过n条数据
  • Take(n):获取当前内容的前三条数据
    // 案例:获取从第3条开始获取3条数据
    var orderedItems = list.Skip(2).Take(3);
    
    // 一页有20条数据(pageSize),当前页为第2页(Current)
    list.Skip(pageSize * (Current -1)).Take(pageSize);
  • 聚合函数:Max()、Min()、Average()、Sum()、Count()
    list.Where(e=>e.Age>30).Min(e=>e.Salary);
    int a = list.Max(x=>x.Age);//返回list中年龄的最大值
    string s = list.Max(e=>e.Name);//字符串的大小比较
  • GroupBy:参数是分组条件表达式,返回值为 IGrouping<TKey,TSource>类型的泛型 IEnumerable,也就是每一组以一个IGrouping对象的形式返回。IGrouping是一个继承自IEnumerable的接口,IGrouping中Key属性表示这一组的分组数据的值
    IEnumerable<IGrouping<int,Employee>> items = list.GroupBy(x=>x.Age);
    foreach(IGrouping<int,Employee> g in items)
    {
        Console.WriteLine(g.Key);//g.Key为分组的条件,这里就是Age
        Console.WriteLine("最大工资:" + g.Max(x=>x.Salary))
        foreach(Employee e in g)
        {
            Console.WriteLine(e);
        }
        Console.WriteLine("*******************");
    }
  • Select:把集合中的每一项转换为另外一种类型
    // 只取年龄
    IEnumerable<int> ages = list.Select(e=>e.Age);
    // 只取name
    var names = list.Select(e=>e.Name);
    //
    var items1 = list.Select(e=>e.Name +""+ e.Age);
    //
    var items2 = list.Where(x=>x.Age>30).Select(x=>x.Name);
    
    // 匿名类型:匿名类型在编译后,会自动生成一个类型,名字由编译器自动生成
    var obj1 = new {Name="ddd",Salary=3000}
    Console.WriteLine(obj1.Name);//"ddd"
    Console.WriteLine(obj1.Salary);//3000
    
    var items = list.Select(e=>new {XingMing = e.Name,NianLing = e.Age,Xingbie=e.Gender?"男":"女"});
    foreach(var i in items)
    {
        Console.WriteLine(i.NianLing + i.XingBie);
    }
    // 年龄分组,并获得工资的最值,以及统计人数等
    public class employee
    {
        public int Age { get; set; }
        public int Salary { get; set; }
        public bool Gender { get; set; }
    }
    var list = new List<employee>();
    list.Add(new employee{Age = 20,Salary =3000,Gender = true});
    list.Add(new employee{Age = 20,Salary =9000,Gender = false});
    list.Add(new employee{Age = 50,Salary =8000,Gender = true});
    list.Add(new employee{Age = 50,Salary =1000,Gender = false });
    list.Add(new employee{Age = 60,Salary =5400,Gender = true});
    list.Add(new employee{Age = 60,Salary =7800,Gender = false });
    list.Add(new employee{Age = 20,Salary =6700,Gender = true});
    
    var items1 = list.GroupBy(e=>e.Age).Select(g=>new 
                 {NianLing = g.Key,MaxS = g.Max(e=>e.Salary),MinS = g.Min(e=>e.Salary),RenShu = g.Count()});
    foreach(var e in items1)
    {
        Console.WriteLine(e.NianLing + "," + e.MaxS +","+ e.MinS + "," + e.RenShu);
    }
    
    // 结果
    20,9000,3000,3
    50,8000,1000,2
    60,7800,5400,2
  • 链式调用
    IEnumerable<employee> items2 = list.Where(x=>x.Salary>5000);
    List<employee> list2 = items2.ToList();
    employee[] array2 = items2.ToArray();
    // 获取id>2的数据,然后按照Age分组,并且把分组按照Age排序,然后取出前3条,最后再投影取得年龄、人数、平均工资
    var list = new List<employee>();
    list.Add(new employee{ Id = 1, Age = 20,Salary =3000,Gender = true});
    list.Add(new employee{ Id = 2, Age = 20,Salary =9000,Gender = false});
    list.Add(new employee{ Id = 3, Age = 50,Salary =8000,Gender = true});
    list.Add(new employee{ Id = 4, Age = 50,Salary =1000,Gender = false });
    list.Add(new employee{ Id = 5, Age = 60,Salary =5400,Gender = true});
    list.Add(new employee{ Id = 6, Age = 60,Salary =7800,Gender = false });
    list.Add(new employee{ Id = 7, Age = 20,Salary =6700,Gender = true});
    
    var result = list.Where(x => x.Id > 2).GroupBy(x => x.Age).OrderBy(x => x.Key).Take(3);
    //result类型:IEnumerable<IGrouping<int,employee>>
    var items = result.Select(x => new { NL = x.Key, RS = x.Count(), pingjun = x.Average(g => g.Salary) });
    foreach (var i in items)
    {
        Console.WriteLine(i.NL + "," + i.RS +"," + i.pingjun);
    }
    
    //结果
    20,1,6700
    50,2,4500
    60,2,6600

     

 

标签:Salary,常用,扩展,Age,list,Linq,employee,var,new
From: https://www.cnblogs.com/SimpleTian/p/17675212.html

相关文章

  • KdMapper扩展中遇到的相关问题
    1.背景  KdMapper是一个利用intel的驱动漏洞可以无痕的加载未经签名的驱动,本人在利用其它漏洞(参考《【转载】利用签名驱动漏洞加载未签名驱动》)做相应的修改以实现类似功能。在这其中遇到了两个重要的问题,记录下来以作参考。 2.CallKernelFunction问题及修改  2.1相关......
  • 常用总线技术基本参数对比
    总线类型CANCANFD以太网100Base-T1以太网1000Base-T1FlexRay信道数11112带宽能力上限/bps1M1M+5M100M1000M单通道10M带宽使用上限/bps500K500K+2M100M1000M2.5M、5M、10M数据区长度/Bytes1-81-6464-150064-1500254网络介入机制半双......
  • 11种常用滤波算法程序
    来源:嵌入式情报局一、限幅滤波法(程序判断滤波法)1/*2A、名称:限幅滤波法(又称程序判断滤波法)3B、方法:4根据经验判断,确定两次采样允许的最大偏差值(设为A),5每次检测到新值时判断:6如果本次值与上次值之差<=A,则本次值有效,7如果本次值与上次值之差>......
  • Java常用四大线程池用法以及ThreadPoolExecutor详解(转)
    为什么用线程池?1.创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处-理效率2.线程并发数量过多,抢占系统资源从而导致阻塞3.对线程进行一些简单的管理在Java中,线程池的概念是Executor这个接口,具体实现为ThreadPoolExecutor类,学习Java中的线程池,就可以......
  • 浅析常用的Python Web的几大框架
    在各种语言平台中,python涌现的web框架恐怕是最多的,是一个百花齐放的世界,各种micro-framework、framework不可胜数;猜想原因应该是在python中构造框架十分简单,使得轮子不断被发明。所 以在Python社区总有关于Python框架孰优孰劣的话题。下面就给大家介绍一下python的几大框架: Djan......
  • 向量搜索技术:基于Elasticsearch/PostgreSQL/Redis扩展的向量搜索数据库或独立向量搜索
    理论基础与研究向量数据库用于非结构化文本、图片、音频、视频搜索、推荐,将他们转换为数字向量表示来进行相似性(ANN)搜索。存储和搜索高维向量是其特征之一,通常采用高级索引技术和算法如HNSW,Annoy,或Faiss来实现。不同于SQL数据库,向量数据库更像nosql,用户接受使用sdk/API......
  • php:命令行的常用例子(php 8.2.5)
    一,查看安装配置信息[liuhongdi@img~]$/usr/local/soft/php8.2.5/bin/php-i           相当于执行:[liuhongdi@img~]$/usr/local/soft/php8.2.5/bin/php-r"phpinfo();”二,列出开启的扩展模块:[liuhongdi@img~]$/usr/local/soft/php8.2.5/bin/php-m[......
  • EasyPlayer开放外部录像接口:自由扩展H.265网页播放功能
    EasyPlayer通过实现视频实时录像功能,不仅提供轻量化、便捷化的视频资源下载能力,同时有效减少了带宽和计算资源的消耗。这种创新的功能使得用户可以灵活地获取所需的视频数据,为其节省使用成本并提升整体效率。今天我们来分享一下EasyPlayer播放器对外开放录像的方法。1)在播放器内部......
  • 直线导轨的常用术语你知道多少?
    直线导轨作为一种重要的机械传动装置,被广泛应用于各种机械设备中,它以其优良的刚度、高精度和可靠性而受到青睐。在直线导轨的使用中,我们必须要清楚其常用的术语,这样我们才能更好的使用直线导轨!1、微型标准导轨:微型标准导轨其实并不是一种单独的产品,而是直线导轨中一种规格较小的产......
  • C++刷题输入输出和常用函数处理
    1.输入数字但非默认的十进制,比如输入的是十六进制数,但要转为十进制再进行别的处理。当我们在编程中处理十六进制数时,通常会将其表示为字符串。cin>>hex>>m;//输入十六进制,m会自动转十进制。2.int和string中单个字符互转strings="12345";inta0=s[0]-'0';//字符转......