12.4.1 自定义查询表达式

C# 正规表达式 C# 正规表达式 新手可以参考一下。 立即下载
 

12.4.1 自定义查询表达式

 

    原则上,我们可以使用查询处理任何支持绑定操作的类型。这是用于函数式编程中的标准名称,像上一节中所示的类型签名的函数。从技术角度讲,我们需要实现可以由 C# 编译器所使用的方法,把查询表达式转换为标准的函数调用。我们将为 12.6 节中的 Option<T> 的类型实现这些方法。该类型没有实现 IEnumerable<T>,所以,标准查询运算符不能使用。

    让我们首先考虑一下,查询应用于选项类型意谓着什么。清单 12.15 显示了两个查询。左边一个处理列表,右边一个处理选项类型。我们将使用两个简单的函数来提供输入:ReadIntList 函数读取整数列表 (类型为 List<int>),TryReadInt 返回选项值(类型为 Option<int>)。

 

Listing 12.15 Using queries with lists and option values (C#)

 

var list =
  from n in ReadIntList()
  from m in ReadIntList()
  select n * m;

var option =
  from n in TryReadInt()
  from m in TryReadInt()
  select n * m;

 

    除了处理的数据类型不同之外,查询完全相同,因此,它们使用不同的查询运算符实现。两个都读取不同的输入,并返回输入整数的积。表 12.1 给出了输入的样例,并显示了结果。

 

表 12.1 对于可能的不同输入,由处理列表和选项值的查询所产生的结果

Type of valuesInput #1Input #2Output

Lists
Options
Options
Options

[2; 3]
Some(2)
Some(3)
None

[10; 100]
Some(10)
None
Not required

[20; 200; 30; 300]
Some(20)
None
None

 

    对于列表,查询执行交叉联接运算(可以想象成在 F# 的序列表达式中,两个嵌套的 for 循环),它会产生一个序列,由输入值的每种组合的条目所组成。对于选项值,有三种可能性。

    ■ 当第一个输入是值时,我们要看第二个。然后,根据第二个输入的不同,会发生以下两种情况:

      — 如果第二个输入也是一个值,则结果也是 Some 值,包含的结果是积。

      — 如果第二个输入是 None,由于没有值相乘,这样,查询返回 None。

    ■ 第一个输入为 None 时,我们知道这个结果无需第二输入。整个查询延迟执行,所以,我们不必去读第二输入:TryReadInt 函数只调用一次。

    正如你所看到的,查询表达式提供了一种简便的方法,来处理选项值。清单 12.15 肯定要比我们在第 6 章中看到的等价代码,容易写 (和读),在那儿,我们显式地使用了高阶函数。在本章的后面,我们将会看到,如何实现所有必要的查询运算符,不过,我们还是先看一下在 F# 中的类似语法。

 

C#表达式解析器-1.0 在修正了优先级问题的基础上,做为1.0版发布。 立即下载

相关推荐

自定义表达式计算 (c#)

用C#实现的表达式计算引擎,支持词法分析,语法分析, 支持自定义关键字,自定义语法规则, 可以在项目里用来实现自定义逻辑计算。

JSP-07使用EL和JSTL简化JSP

本文主要介绍:1.EL表达式的使用;2.JSTL标签的使用(标准标间、条件标签、迭代标签)、3.JSTL引用自定义函数。

云哥的博客 1291

C#中字符串转换为计算公式-并进行计算的方法(自定义公式的计算)

C#中字符串转换为计算公式-并进行计算的方法(自定义公式的计算)

C#表达式编程指南: 执行表达式、解释表达式、生成表达式,翻译表达式的详解与示例

在C#中,表达式树(Expression Tree)是一种树形的数据结构,它表示了.NET中的表达式。表达式树中的每个节点代表表达式中的一个元素,例如常量、变量、方法调用等。在C#中,表达式树主要用于LINQ(Language Integrated Query)查询以及动态生成代码场景。本篇博客将详细讲解在C#中如何执行、解释、生成和翻译表达式。

qq_35320456的博客 1738

c# 表达式(公式)计算

c# 表达式计算 支持公式\常见函数计算 如:round(pi * (abs(pow(-3, 2)) + sqrt(147 * (14 + 27))))

第12章 STM32+BH1750光照传感器+OLED模块显示环境光照强度

相比光敏传感器,它可以直接输出环境光照强度的数值(范围是0~65535lx),非常适合懒人党,各位的传感器买到手后,赶紧跟着文章试试吧!

qq_44645742的博客 1万+

[转]C#通过Expression实现 字符串转表达式 自定义计算体积参数

这篇文章是为了解决我工作中的一个需求而写,希望能帮到有需要的人需求的这样的:业务想让用户输入任意表达式进行计算假如成立则允许操作表达式组成:常量与特殊变量进行任意加减乘除有特殊值比较大小L+2*W<200H>50调用方法//计算表达式的值//比较表达式是否成立//验证表达式是否成立(!=-1表示成立)代码实现/// 计算体积参数#region 私有类/// 体积参数类/// 不可以去掉。

Sky的专栏 560

2023年全国职业院校技能大赛高职组“区块链技术应用”赛项赛卷(3卷)解析

我们先绘制题组中所有设计图我这边作图用的国内的在线作图工具。

2301_76737000的博客 5417

Linq学习__05__查询表达式和方法查询比较

(1)在HomeController中新建Index2方法如代码1.1 代码1.1   #region 用查询表达式和方法查询实现同样的查询 /// /// 访问地址 Home/Index3 /// orderby,Where(),OrderBy(),OrderByDescending() ///

DHCsimida的专栏 713

MTK Linux DRM分析(八)- KMS drm_crtc.c

CRTC 在 Linux DRM 子系统中是显示控制的核心,负责时序生成、模式设置和管线的调度。理解其工作原理和 API 对于进行底层图形开发、调试显示问题或 simply understanding how your graphics stack works 都至关重要。

iTom1900 1347

卸载重装Ubuntu22.04双系统

先说一下写此篇文章的背景吧,我在Windows下配置了三个cornerNet深度学习环境分别是cuda10.3(显卡版本太高不支持),cuda11.3(配置后偶然看到一篇说这个版本win下只能用CPU跑),最后是cuda11.1终究还是没能跑通代码,因为它的代码是在Liunx系统写的,就想着装个Ubuntu试试看,在网上看说一般软件不要装太高版本,我就下载了470版的显卡驱动,跟着步骤升级了系统内核,结果第二天开机Ubuntu就崩了,开机黑屏左上角只有一道横杠显示,只能按ctrl+shift+f5进入命令窗

编程小白的博客 8101

12.构造器的查询表达式

users = DB::table('users')->where('username', 'like', '%小%')->get();3. DB::raw()方法可以在 select()内部实现原生表达式,否则解析错误;2. addSelect()方法,可以在你基础的查询构造器上再增加想要显示的字段;//如果条件都是等于,查看 SQL 语句用->toSql()替换->get()1. where()查询,即条件查询,完整形式需要字段表达式和值三个;['gender', '=', '男']

qq_34820433的博客 1107

基于Python的房地产评估数据抓取与分析 —— 房价走势与市场报告

在房地产行业中,了解和分析房产价格的变化趋势、各个地区的房价差异以及市场评价报告,可以帮助投资者、购房者以及政策制定者做出更加明智的决策。本文介绍了如何使用Python爬虫技术抓取房地产平台上的房产评估报告、价格走势等数据,并对抓取的数据进行分析。通过这些技术,您可以自动化抓取房地产平台的数据,分析房价走势,获取市场报告,为房地产投资决策提供数据支持。假设我们要从链家网抓取某个房产的价格、房产描述以及历史成交价格,首先需要获取目标房产页面的URL,并发送HTTP请求。伪装为常见浏览器,避免被识别为爬虫。

2201_76125261的博客 845

linq to objects 查询表达式

首先定义数据源 //学生类 public class Student { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public int classId { get; set; } public static Li...

程序员二胖 266

Transformer模型在时间序列预测中的应用:价格和产量预测

Transformer模型由Attention is All You Need论文提出,并在机器翻译任务上取得了巨大成功。其主要特点是使用自注意力机制代替传统的递归或卷积操作进行序列建模。Transformer模型由编码器和解码器组成,其中编码器用于学习输入序列的表示,解码器用于生成目标序列。在时间序列预测中,我们只需要使用Transformer的编码器部分。编码器将历史数据作为输入,学习一个表示,然后使用该表示来预测未来的数值。

HnrzLinux的博客 736

【Claude】媒体文件处理错误:PDF 与 Image 过大的检测与预处理方法 bug报错已解决

图片压缩是必须的:原始图片的 base64 会占用大量 TokenPDF 提取文本优于传图片:文本版 PDF 比扫描版更省 Token分块处理大文件:不要一次性处理整个大文件控制分辨率:800x800 通常足够 Claude 分析。

博客 6359

Linq专题之创建Linq查询表达式

  本节我们主要介绍一下如何创建查询集合类型,关系数据库类型,DataSet对象类型和XML类型的数据源的Linq查询表达式。   下面在实例代码ReadyCollectionData()函数创建了准备的数据源: 1、创建集合类型的查询。       创建一个UserBaseInfo类:     1 public class UserBaseInfo 2 { 3 ...

weixin_34006965的博客 96

3D结构光 vs TOF——手机厂商为何选择TOF方案?

3D视觉感知技术路线分析:结构光与TOF对比 3D视觉感知领域存在结构光和TOF两大主流技术。结构光基于三角定位法,精度高(毫米级)但工作距离短(<1.5米),适合人脸识别等近距离场景;TOF通过测量光脉冲飞行时间计算深度,精度中等(厘米级)但工作距离长(0.5-5米+),更适合AR导航等中远距离应用。手机厂商选型时考虑:前置认证选择结构光(如苹果FaceID),后置场景倾向TOF(安卓阵营),因后者更适配全面屏设计、环境适应性强且成本优势明显。两种技术互补共存,共同推动3D感知应用发展。

致力于lidar应用开发 111

11.7 【Linq】在查询表达式和点标记之间作出选择

11.7.1 需要使用点标记的操作 最明显的必须使用点标记的情形是调用 Reverse 、 ToDictionary 这类没有相应的查询表达式语法的方法。然而即使查询表达式支持你要使用的查询操作符,也很有可能无法使用你想使用的特定重载。例如, Enumerable.Where 包含一个重载,将父序列的索引作为另一个参数传入委托。因此,要从序列中排除其他项可以这样: 1 ...

weixin_30418341的博客 153

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

CSharpThinking---查询表达式与Linq to Objects(五)

  本章单独介绍查询表达式与Linq to Objects 的世界,展示其强大的语言特性与设计者的“编译器支持”理念。   本文不会按照“由浅入深”的思路来讲解概念,相反从特性的本质及关联讲起,最后简单介绍一些“小技巧”和需要注意的地方,着实有头重脚轻的感觉。--- 史蒂芬King    一,概念   1.1 查询表达式起源      C#语言的设计者决定在C#3中提供一个...

weixin_30399155的博客 100

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

集合访问中的LINQ查询表达式与普通方法对比

C# 中集合的概念不仅指的是System.Collection和System.Collection.Generic集合中的结合类型,实际上其他数据也可看作集合,如XML文件,数据库,数组都是集合,高效地集合操作能大大提高开发效率,C#中对于集合的操作希望做到尽量简单,统一,.NET Framework 3.5种引入的Linq(语言集成查询)实现了这一功能。 下面我们以无序的List为例,来体验l...

weixin_30664539的博客 168

Django查询表达式

【代码】Django查询表达式。

m0_61993498的博客 1039
上一篇: 12.4 可选工作流(alternative workflows)
下一篇: 12.4.2 自定义 F# 语言
心想才事成
博客等级 码龄20年 104粉丝 420原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值