首页 > 编程语言 >C#Linq常用方法

C#Linq常用方法

时间:2023-12-12 18:12:31浏览次数:28  
标签:常用 C# Age list Linq item var new Id

Linq一般都在System.Linq命名空间下,是针对IEnumable类型集合的扩展方法,配合Lambda能简化数据的处理

where(Func<T,bool>):根据条件过滤,实现原理如下

namespace ConsoleApp2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 10 };
            var result= list.MyWhere(x => x > 5);
            foreach (var item in result)
            {
                Console.WriteLine(item);
            }
        }
    }

    public static class EnumableExtension
    {
        public static IEnumerable<T> MyWhere(this IEnumerable<T>Source,Func<int,bool> filter)
        {
           IEnumerable<T> result = new List<T>();
           foreach (int i in list)
            {
                if(filter(i)) yield return i;
            }
        }
    }
}

 

2、Count():集合中元素个数

3、Count(Func<T,bool>):集合中满足条件的个数,实现原理如下:

   public static int MyCount<T>(this IEnumerable<T> Source,Func<T,bool> filter)
   {
       int count = 0;
       foreach (var item in Source)
       {
           if (filter(item)) count++;
       }
       return count;
   }

  static void Main(string[] args)
  {
      List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 10 };
     
      Console.WriteLine(list.MyCount(x=> x > 5));
  }

4、Any():判断集合中是否包含任何元素,返回Bool

5、Any(Func<T,bool>):判断集合中是否有包含满足条件的元素,返回bool,实现原理如下:

 public static bool MyAny<T>(this IEnumerable<T> Source,Func<T,bool> filter)
 {
    
     foreach (var item in Source)
     {
         if(filter(item))
         {
            return true;
         }
     }
     return false;
 }

static void Main(string[] args)
{
    List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 10 };
    var result= list.MyAny(x => x > 5);
    Console.WriteLine(result);
}

6、Singe(Funce<T,bool>)、SingleOrDefault(Funce<T,bool>)、First(Funce<T,bool>)、FistOrDefult(Func<T,bool>)、Last(Funce<T,bool>)、LastOrDefult(Funce<T,bool>)的区别

 Singe(Funce<T,bool>)的实现原理如下:

 public static T MySinge<T>(this IEnumerable<T> Source, Func<T,bool> filter)
 {
     //1、集合为Null时,引发异常
     //2、集合不包含任何满足条件的元素时,引发异常
     //3、集合包含一个满足条件的元素时,返回改元素
     //4、集合包含不止一个满足条件元素时,引发异常
     if(Source == null)
     {
         throw new Exception("集合为空");
     }

     int count = 0;
     T result=default(T);
     foreach (var item in Source)
     {
         if(filter(item))
         {
             count += 1;
             if(count>1)
             {
                 throw new Exception("不止一个元素满足条件");
             }
             else
             {
                 result = item;
             }
         }
     }
     if(count==0)
     {
         throw new Exception("没有满足条件的元素");
     }
     return result;
     
 }

7、排序相关,返回类型是IOrderedEnumerable,IOrderedEnumerable也是继承于IEnumerable,所以可以继续执行Linq语句,形成链式查询

  OrderBy():正序排序
  OrderByDescending():倒序排序

  IOrderedEnumerable.ThenBy():排序之后再正序
  IOrderedEnumerable.ThenByDescending():排序之后再降序

8、限制结果集,获取部分数据:

  Skip(int):跳过n条数据

  Take(int):获取n条数据

9、GroupBy():分组,类似于SQL的GroupBy

10、Select:投影,把集合中的每一项转换成另外一种类型

       可以结合匿名类型方便的获取到想要的数据,匿名类型:var obj1=new {Name="AAA",Salary=3000};只能用var定义

static void Main(string[] args)
{
    List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 10 };
    var list1=  list.Select(x => new { Id = x });
    foreach (var item in list1)
    {
        Console.WriteLine(item.Id);
    }
}

11、GroupBy():分组,类似于SQL的GroupBy

12、聚合函数:    

  Max():获取最大值
  Min():获取最小值
  Average():求平均值
  Sum():求和
  Count():个数

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

List<Employee> list = new List<Employee>();
list.Add(new Employee { Id = 1, Name = "jerry", Age = 28, Gender = true, Salary = 5000 });
list.Add(new Employee { Id = 2, Name = "jim", Age = 33, Gender = true, Salary = 3000 });
list.Add(new Employee { Id = 3, Name = "lily", Age = 35, Gender = false, Salary = 9000 });
list.Add(new Employee { Id = 4, Name = "lucy", Age = 16, Gender = false, Salary = 2000 });
list.Add(new Employee { Id = 5, Name = "kimi", Age = 25, Gender = true, Salary = 1000 });
list.Add(new Employee { Id = 6, Name = "nancy", Age = 35, Gender = false, Salary = 8000 });
list.Add(new Employee { Id = 7, Name = "zack", Age = 35, Gender = true, Salary = 8500 });
list.Add(new Employee { Id = 8, Name = "jack", Age = 33, Gender = true, Salary = 8000 });
//获取Id > 2的数据,然后按照Age分组, 并且把分组按照Age排序,然后取出前3条,最后再投影取得年龄、人数、平均工资
var aaa= list.Where(x => x.Id > 2).GroupBy(x => x.Age).OrderBy(x => x.Key).Take(3).Select(x => new { Age = x.Key, Count = x.Count(), Av = x.Average(y => y.Salary) });
foreach (var x in aaa)
{
    Console.WriteLine($"{x.Age},{x.Count},{x.Av}");
}

结果:

 

标签:常用,C#,Age,list,Linq,item,var,new,Id
From: https://www.cnblogs.com/yxh33/p/17896644.html

相关文章

  • ArgoCD 同步配置
    自动同步策略当ArgoCD检测到Git中所需的清单与集群中的实时状态之间的差异时,它能够自动同步应用程序。自动同步的好处是CI/CD管道不再需要直接访问ArgoCDAPI服务器来执行部署。相反,管道会提交并推送到Git存储库,并对跟踪Git存储库中的清单进行更改。PruneResour......
  • Quick BI 数据分析 - Alibaba Cloud的文档PDF
     下载地址:https://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/download%2Fpdf%2F164487%2F%25E6%2595%25B0%25E6%258D%25AE%25E5%2588%2586%25E6%259E%2590_intl_zh-CN.pdf      ......
  • 【Centos】Centos 7.6 安装 JDK8
    1  前言继续安装我们的JDK8。2 安装步骤2.1 下载rpm包wget--no-check-certificate--no-cookies--header"Cookie:oraclelicense=accept-securebackup-cookie"http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u13......
  • 【转载】QT学习之路(一)ubuntu 18.04的Qt Creator在线安装
    https://blog.csdn.net/qq_26849933/article/details/127115102前言Qt是嵌入式开发的必备工具之一,在Linux下安装尤其重要。Qt是C++的一个库,或者说是开发框架,里面集成了一些库函数,提高开发效率。QtCreator是一个IDE,就是一个平台,一个开发环境,类似的比如说VS,也可以进行Qt开发,当......
  • 【Python爬虫】爬虫框架Scrapy初使用_爬取4399游戏页面数据
    Scrapy简介Scrapy是一个用于爬取和提取数据的开源web抓取框架。它提供了一个强大的机制,让开发者可以轻松地创建和管理爬虫程序,以从网站上自动提取结构化的数据。以下是Scrapy的一些主要特点和优势:强大灵活的爬取能力:Scrapy具有高度可配置的请求处理和数据提取功能。它可以轻......
  • AtCoder Grand Contest 001
    比赛链接A-BBQEasy从小到大排序以后,答案就是所有奇数位置之和。B-MysteriousLight发现去掉前两次反射以后,剩下的是一个在平行四边形内反射的过程,且形式类似于辗转相除。具体地,\[F(n,x)=\begin{cases} -n&x=0\\ 2x\lfloor\frac{n}{x}\rfloor+F(x,n\bmodx)&x>0\e......
  • select for update在springboot里实现分布式锁
    //mapper,注意,这里的参数最好就是主键或者唯一键,否则产生的是表锁@Select("<script>select*fromfoowhereid=#{id}forupdate</script>")FooselectForUpdateById(@Param("id")Longid);//service,必须加事物,否则selectForUpdateById无法实现分布式锁的作用@Transac......
  • TCP和UDP的区别
    TCPTCP(TransmissionControlProtocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立,其中的过程非常复杂,过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送同......
  • pure-admin pnpm  ERR_PNPM_FROZEN_LOCKFILE_WITH_OUTDATED_LOCKFILE  Cannot perf
    事情是这样的,用的开源pure-admin的框架,用的是pnpm,本地环境都是可以的,但是发布到生成就报以下错误  然后看部署参数,是这样的,强制用了lock文件,本来也没问题 报错的意思是json文件跟pnpm-lock.json文件不匹配但是本地看着是匹配的,随便挑选几个包版本看着也是一致的然后......
  • OpenCASCADE Poly HLR Edge
    Abstract. HLRBRep_PolyAlgoisbasedontheprincipleofcomparingeachedgeoftheshapetobevisualizedwitheachofthetrianglesoftheshape,andcaculatingthevisibleandthehiddenpartsofeachedge.Foragivenprojection,HLRBRep_PolyAlgocalcu......