首页 > 其他分享 >LINQ准备

LINQ准备

时间:2024-07-04 22:21:47浏览次数:8  
标签:Console int i2 LINQ i1 result WriteLine 准备

你我之间,不需要时间在场。--zhu
一.为什么要学LINQ
LINQ能让数据处理变得简单。
例:统计一个字符串中每个字母出现的频率(忽略大小写),然后按照从高到低的顺序输出出现频率高于2次的单词和其出现频率。

var items = s.Where(c=>char.IsLetter(c))//过滤非字母
  .Select(c=>char.ToLower(c))//大小字母转换为小写
  .GroupBy(c=>c)//根据字母进行分组
  .Where(g=>g.Count()>2)//过滤掉出现次数<=2
  .OrderByDescending(g=>g.Count())//按次数排序
  .Select(g=>new {Char=g.Key,Count=g.Count()});

推演
委托->lambda->LINQ
委托:
1.委托是可以指向方法的类型,是变量,调用委托变量时执行的就是变量指向的方法。
2..net中定义了泛型委托Action(无返回值)和Func(有返回值),所以一般不用自定义委托类型。

static void Main(string[] args)
{
  D1 d= F1;
  d();
  d=F2;
  d();
  D2 d2 = Add;
  Console.WriteLine(d2(3,5));

  Action a=F1; //没返回值
  a();
  Func<int,int,int> f =Add;  //有返回值
  Console.WriteLine(f(3,5));
}
static void F1()
{
  Console.WriteLine("我是F1");
}
static void F2()
{
  Console.WriteLine("我是F2");
}
static int Add(int i1,int i2)
{
  return i1+i2;
}
delete void D1();
delete void D2(int i,int j);
--运行结果:我是F1 我是F2

委托变量不仅可以指向普通方法,还可以指向匿名方法。

Func<int,int,string> f1=delegate(int i1,int i2){
  return $"{i1}+{i2}={i1+i2}";
};
srting s=f1(1,2);
Action f2= delegate(){
 Console.WriteLine("我是f2");
};
f2();
Action<string,int> f3= delegate(string n,string i){
 Console.WriteLine($"n={n},i={i}");
};
f3("f3",18);

匿名方法可以写成lambad表达式,可以省略参数数据类型,因为编译能根据委托类型推断出参数的类型,用=>引出方法体。

Func<int,int,string> f1 = (i1,i2) =>{
  return $"{i1}+{i2}={i1+i2}";
};

如果委托没有返回值,且方法体只有一行代码,可省略{}

Action<int,string> a1 = (age,name) => Console.WriteLine($"年龄{age},姓名{name}");
a1(18,"a1");

如果委托有返回值,且方法体只有一行代码,可省略{}以及return

Func<int,int,string> f1 = (i1,i2) => $"{i1}+{i2}={i1+i2}";
Console.WriteLine(f1(5,8));

如果委托只有一个参数,参数的()可以省略

Action<string> a1 = s => Console.WriteLine(s);
Func<int,bool> f2 = i => i>5;

回到LINQ
LINQ提供了很多集合的扩展方法(https://learn.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/extension-methods),配合lambad能够简化数据处理。

int[] nums =new int[] {3,99,88,77,5,2,66,7,54};
IEnumerable<int> items = nums.Where(i=>i>10);//using System.Linq;
foreach(int i in result)
{
  Console.WriteLine(i);
}

注意:IEnumerable 是一个接口,它允许你使用 foreach 循环来遍历集合中的元素,并且提供了一种灵活的方式来处理集合数据。https://www.cnblogs.com/wml-it/p/14776958.html

自己写拓展方法MyWhere()

static IEnumerable<int> MyWhere1(IEnumerable<int> items,Func<int,bool> f)
{
  list<int> result=new List<int>();
  foreach(int i in items)
  {
    if(f(i)==true)
    {
      result.Add(i)
    }
  }
  return result;
}
static IEnumerable<int> MyWhere2(IEnumerable<int> items,Func<int,bool> f)
{
  foreach(int i in items)
  {
    if(f(i)==true)
    {
      yieid return i; //迭代器
    }
  }
  return result;
}
--调用
static void Main(string[] args)
{
  int[] nums=new int[] {3,4,45,7,2,9,35};
  //IEnumerable<int> result=MyWhere1(nums,a=>a>10);
  IEnumerable<int> result=MyWhere2(nums,a=>a>10);
  foreach(int i in result)
  {
    Console.WriteLine(i);
  }
}

关于yieldhttps://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/statements/yield

标签:Console,int,i2,LINQ,i1,result,WriteLine,准备
From: https://www.cnblogs.com/zhusichen/p/18283108

相关文章

  • C#-听说有人不推荐使用Linq!?
    先说结论linq和直接遍历的性能差异点主要还是迭代方式,数组和字符串这类的foreach都是专门有优化的,而linq都是通用的泛型调用迭代器,如果刚好遇到这类数据又需要高性能就尽量不用linq,其他类型或性能要求不高的还是linq香。(ps:linq写的不好不能怪linq)背景起初是看到有人写的博客......
  • 课前准备---HD数据结合图像识别获取真实的空间单细胞级数据
    作者,EvilGeniusHD数据不同于Xenium,目前还是横屏竖直的一刀切数据分析模式,但是真实的细胞绝对不是如此分布的,那么实际分析中,2um的精度配合图像的信息,获取真实的细胞分布数据,就成了分析的必须。多说一句,分析的准确性和超前化也是公司对核心分析人员的核心要求。如下如,我们最......
  • 学懂C#编程:常用高级技术——学会C#的高级特性 LINQ
    LINQ(LanguageIntegratedQuery)是C#中的一项强大特性,它允许开发者以一种统一的方式查询和操作各种数据源,如集合、数据库、XML等。LINQ将查询功能直接集成到C#语言中,使得数据查询和操作变得更加直观和高效。LINQ的基本概念LINQ的核心思想是将数据查询表达为一种类似于SQL的查......
  • 1.课程介绍及环境准备
    此合集是刘老师教编程的学习笔记,是个值得推荐的upup链接https://space.bilibili.com/472907970?spm_id_from=333.788.0.01.课程介绍及环境准备SpringBoot+vue全栈开发基础开发工具:IDEA+VSCode后端:javaEE企业级框架:SpringBoot+MyBatisPlus前端:Vue+VueRouter+Vuex......
  • 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-1-环境准备与搭建
    1.简介Python+Playwright系列的文章还没有结束,就有好的小伙伴或者童鞋们私信公众号留言,问宏哥什么时候出Java语言的Playwright的自动化测试文章。本来想趁热打铁将Python+Playwright完结后,就开始Java语言的Playwright的自动化测试文章,但是好多人私信留言,索性就两个系列的文章......
  • JDK17学习前的准备
    为什么学JDK171、目前JDK长期支持的版本(LTS)有JDK8、JDK11、JDK17、JDK21,博主最近在学习SpringCloud时发现:SpringCloudDalston、Edgware、Finchley、Greenwich、2020.0(又名Ilford)、2021.0(又名Jubilee)和2022.0(又名Kilburn)都已达到生命终结状态,不再受支持!而且根据官网SpringCloud......
  • 2024年深圳市重点小巨人企业申报流程及材料准备要点
    面对2024年深圳市重点小巨人企业的申报机遇,众多中小企业正蓄势待发。这一政策旨在筛选具有专业化、精细化、特色化和创新力的领军企业,为他们提供政策支持和市场认可。然而,申报过程并非易事,它要求企业准确理解申报方式,严格遵守材料要求。那么,究竟需要采取哪些步骤,准备哪些材料,才......
  • 课前准备---多样本ATAC联合分析(封装版)
    作者,EvilGenius大家好,我们的课程已经在进行中了,需要分享给大家很多的分析资料,大家好好学习,资料很珍贵,好好保存。ATAC的主流分析内容1)Readfilteringandalignment2)Barcodecounting3)Identificationoftransposasecutsites4)Detectionofaccessiblechromatinpeaks......
  • 课前准备---从单细胞数据如何识别肿瘤特异性的TCR序列
    作者,EvilGenius参考文章Predictionoftumor-reactiveTcellreceptorsfromscRNA-seqdataforpersonalizedTcelltherapy|NatureBiotechnology鉴别源自患者的肿瘤反应性T细胞受体(Tcellreceptors,TCR)作为个性化转基因T细胞疗法的基础,仍然是一项耗时且费用昂贵的工......
  • FireFox 编译指南2024 Windows10篇-环境准备(一)
    1.引言在开源浏览器项目中,Firefox因其高性能和灵活性而备受开发者青睐。为了在本地环境中编译和定制Firefox,开发者需要做好充分的环境准备工作。这不仅是编译成功的基础,也是后续调试、优化和二次开发的关键步骤。编译Firefox是一个复杂而耗时的过程,涉及大量的代码文件和依赖......