首页 > 编程语言 >C# Linq 延迟查询的执行

C# Linq 延迟查询的执行

时间:2024-09-26 19:46:50浏览次数:8  
标签:Console C# Juan iteration Linq names WriteLine namesWithJ 延迟

C# Linq 延迟查询的执行

 

在定义linq查询表达式时,查询是不会执行,查询会在迭代数据项时运行。它使用yield return 语句返回谓词为true的元素。

复制代码
var names = new List<string> { "Nino", "Alberto", "Juan", "Mike", "Phil" };
var namesWithJ = from n in names
                 where n.StartsWith("J")
                 orderby n
                 select n;
Console.WriteLine("First iteration");
foreach (string name in namesWithJ) 
{
    Console.WriteLine(name);
}
Console.WriteLine();

names.Add("John");
names.Add("Jim");
names.Add("Jack");
names.Add("Denny");

Console.WriteLine("Second iteration");
foreach (string name in namesWithJ)
{
    Console.WriteLine(name);
}
复制代码

运行结果为

复制代码
First iteration
Juan

Second iteration
Jack
Jim
John
Juan
复制代码

从执行结果可以看出,当在定义namesWithJ时并不会执行,而是在执行每个foreach语句时进行,所以后面增加的“John”、“Jim”、“Jack”和“Denny”在第二次迭代时也会参与进来。

ToArray()、ToList()等方法可以改变这个操作,把namesWithJ的定义语句修改为

var namesWithJ = (from n in names
                  where n.StartsWith("J")
                  orderby n
                  select n).ToList();

运行结果为

First iteration
Juan

Second iteration
Juan

在日常工作中,我们常会使用 datas.Where(x=>x.XX == XXX).FirstOrDefault() 和 datas.FirstOrDefault(x=>x.XX == XXX),其实这两种写法性能是等效的,如果真的要在性能上分个高低,请见接下来的文章

应避免错误写法是 datas.Where(x=>x.XX == XXX).ToList()[0]。

标签:Console,C#,Juan,iteration,Linq,names,WriteLine,namesWithJ,延迟
From: https://www.cnblogs.com/sexintercourse/p/18434162

相关文章

  • C# Linq.FirstOrDefault、Linq.Where、Linq.AsParallel、List.Exists、List.Find、Dic
    C#Linq.FirstOrDefault、Linq.Where、Linq.AsParallel、List.Exists、List.Find、Dictionar.TryGetValue、HashSet.Contains性能的比较 今天我们来比较一下集合检索方法性能更优问题,测试代码publicclassEntity{publicintId{get;set;}publicintNo{......
  • ASP.NET MVC Autofac依赖注入的一点小心得(包含特性注入)
    ASP.NETMVCAutofac依赖注入的一点小心得(包含特性注入) 前言IOC的重要性大家都清楚..便利也都知道..新的ASP.NETCore也大量使用了这种手法..一直憋着没写ASP.NETCore的文章..还是怕误导大家..今天这篇也不是讲Core的 前面写了C#开发移动应用系列 就第一篇和最后......
  • systemd socket 实现按需启动
    当使用systemd按需启动某套接字进程后,其图示大致如下:当需要访问该服务时候,systemd会接收请求流量,而后启动后端真实的服务,最后转发该流量,并且关闭原始套接字,图示如下:实现一个socket步骤所谓的按需启动,其实是systemd下的socket配置单元,其命名规则以.socket为后缀,主要服务于套......
  • 使用.NET并行任务库(TPL)与并行Linq(PLINQ)充分利用多核性能
    使用.NET并行任务库(TPL)与并行Linq(PLINQ)充分利用多核性能 前言最近比较闲,(项目要转Java被分到架构组,边缘化人员,无所事事哈哈哈哈)记录一下前段时间用到的.NET框架下采用并行策略充分利用多核CPU进行优化的一个方法起因是项目中有个结算的方法,需要汇总一个月的数据......
  • C# + WPF 音频播放器 界面优雅,体验良好
    阅读目录前言项目介绍项目页面项目源码项目地址最后前言本文介绍一款使用C#与WPF开发的音频播放器,其界面简洁大方,操作体验流畅。该播放器支持多种音频格式(如MP4、WMA、OGG、FLAC等),并具备标记、实时歌词显示等功能。另外,还支持换肤及多语言(中英文)切换。核心音频......
  • codeforces round 971(div4)E(二分答案,禁用数学方法)
    解题历程:开始想的是用数学公式的方法,利用公式推出二次函数,再求出根,再用根求出答案,检查了一个小时,结果怎么改都有细微的偏差,最后发现答案先单调递减在单调递增,那么可以用二分答案的方法查找最小的答案,二分对细节的处理要求比较高,于是在二分中加入了一个限制,当二分的区间小于5时,就......
  • Docker 教程:在 Mac M2 上运行 PostgreSQL
    前提条件  -已安装[DockerDesktop] 创建Docker卷  首先,创建一个名为`pgdata`的Docker卷,以便用于PostgreSQL数据存储。  dockervolumecreatepgdata运行PostgreSQL容器  使用以下命令启动PostgreSQL容器:  dockerrun--namepostgres -ePOS......
  • CSP 模拟 33
    A商品对于一个数对\((x,y)[x<y]\),无论怎样选择区间,这个数对的贡献都是\(y-x\),那么考虑对于所有数对,把\(x\)和\(y\)分别放到一起,排好序。如果当前区间确定,在两个数组二分一下,前缀和就能处理出答案。显然区间越大越好,所以只考虑区间左端点,考虑只对于点对\((x,y)\)来说,\(l......
  • 交替方向乘子法(Alternating Direction Method of Multipliers,简称ADMM)
    ADMMADMM简介交替方向乘子法(AlternatingDirectionMethodofMultipliers)通常用于解决存在两个优化变量的只含等式约束的优化类问题,其一般形式为:min⁡......
  • CF1063E Lasers and Mirrors题解
    一道很好的手玩题,被薄纱了。首先判掉\(\foralli,p_i=i\)的情况(显然是\(n\))然后考虑按照\(p_i\)连边,先构造每一个环的方案。发现可以简单放置两面镜子使得\(i\)射到\(p_i\),而且只要从高到底构造,一定不会产生影响。但是每一个环的最后一个点很特殊,因为第1个点下面放置了让第1个......