是否应该在第二个 lambda 中重用 LINQ lambda 表达式参数?

2023-11-23

下列的这个问题我想知道lambda参数表达式实例的重用应该被认为是好还是坏?

我有时会得到一个完整的 LINQ 表达式树,其中相同的 lambda 参数实例在第二个非嵌套 lambda 中正确使用:

// class Person { public int AProp { get; set; } public bool BProp { get; set; }}
var lparam = Expression.Parameter(typeof(Person),"x");
var lambda1 = (Expression<Func<Person,int>>)Expression.Lambda(Expression.Property(lparam, "AProp"), lparam);
var lambda2 = (Expression<Func<Person,bool>>)Expression.Lambda(Expression.Property(lparam, "BProp"), lparam);
var source = (new Person[0]).AsQueryable();
var query = source.Where(lambda2).OrderBy(lambda1); 

因此,相同 lambda 参数实例 lparam 的声明对于 lambda1 和 lambda2 都是正确的。

只是这个共享 lambda 参数实例强制 IQueryProvider 实现不基于纯 lambda 参数引用关联其他全局含义,因为在处理不同 lambda 期间可能需要以不同方式解释相同的参数。另外,您不会通过使用 LINQ 获得这种表达式树(或者我应该说图形?)

Expression<Func<Person,int>> lambda3 = x => x.AProp;
Expression<Func<Person,bool>> lambda4 = x => x.BProp;

因为两个 lambda 表达式都会有不同的 (Person x) 参数实例。同样适用于

var query = source.Where(x => x.BProp).OrderBy(x => x.AProp);

or

var query = from x in source where x.BProp order by x.AProp select x;

它还使表达式树更像是一个图。

这种重用参数实例的方式被认为是好还是坏?到目前为止,我还没有从官方那里得到明确的答复。


我不会在两个不相交的 lambda 之间共享参数对象。

首先,我们不要在这里制造虚假经济。物品很便宜,你不会制造十万个。 (如果是的话,你可能还有更大的问题需要解决。)

其次,正如您所注意到的,在不相关的 lambda 之间共享引用相同的参数对象意味着分析这些 lambda 表达式树的代码需要了解参数对象在不同上下文中具有不同的含义。这似乎是一个等待发生的错误。

第三,想象有一天你可能想要使用两个表达式树:

x => Foo(x);
y => Bar(y);

然后根据它们构建第三个,说:

(x,y) => Foo(x) && Bar(y);

如果 x 和 y 实际上都是相同的参数对象,那么您就会遇到问题:

(x,x) => Foo(x) && Bar(x);  // Huh?

另一方面,StriplingWarrior 的回答指出,如果你有

x => Foo(x);
x => Bar(x);

那么将它们组合起来更容易

x => Foo(x) && Bar(x);

因为那样你就会not需要重写任何东西。

基本上,这似乎是一个冒险的举动,没有真正令人信服的好处,那么为什么要这么做呢?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否应该在第二个 lambda 中重用 LINQ lambda 表达式参数? 的相关文章

  • C修改printf()输出到文件

    有没有办法修改printf为了将字符串输出到文件而不是控制台 我尝试在互联网上查找一些内容 发现了类似的电话dup dup2 and fflush这可能与此有关 EDIT 也许我不清楚 问题是这是C考试问题 问题如下 解释一个通常将字符串输
  • 没有 Unicode 字节顺序标记。无法切换到 Unicode

    我正在使用 XSD 编写 XML 验证器 下面是我所做的 但是当验证器到达该线时while list Read 它给了我错误 没有 Unicode 字节顺序标记 无法切换到 Unicode 有人可以帮我解决吗 public class Va
  • C# 中的协变和逆变

    首先我要说的是 我是一名正在学习 C 编程的 Java 开发人员 因此 我会将我所知道的与我正在学习的进行比较 我已经使用 C 泛型几个小时了 我已经能够在 C 中重现我在 Java 中知道的相同内容 除了几个使用协变和逆变的示例 我正在读
  • Android NDK C++“wstring”支持

    我有用 C 编写的源代码 lib 现在我想在 Android NDK 项目 NDK 6 中编译并使用相同的源代码 lib 我能够编译大多数 C 文件 除了基于 std wstring 的功能 在 Application mk 中 当我指定时
  • 关闭 XDOCUMENT 的实例

    我收到这个错误 该进程无法访问文件 C test Person xml 因为它是 被另一个进程使用 IOException 未处理 保存文件内容后如何关闭 xml 文件的实例 using System using System Collec
  • 如何使用汇编获取BIOS时间?

    我正在从头开始实现一个小型操作系统 用于教育目的 现在 我想使用汇编来获取 BIOS 时间 我对此进行了很多搜索 但找不到任何代码示例来执行此操作 如果有人可以提供任何参考或代码示例或与此相关的任何内容 我将非常感激 See 时钟中断 1a
  • C 中的模仿函数重写

    具体来说 函数重写能够调用基本重写方法 这有两部分 一个是预编译的库代码 1 另一个是库的用户代码 2 我在这里实现了一个尽可能最小的经典 Person 和 Employee 示例 非常感谢了解 OOP 概念的铁杆 C 开发人员的回应 我正
  • 使用反射获取基类的受保护属性值

    I would like to know if it is possible to access the value of the ConfigurationId property which is located in the base
  • 导出到 CSV 时 Gridview 出现空行

    这个问题是由进一步讨论引发的这个问题 https stackoverflow com questions 6674555 export gridview data into csv file 6674589 noredirect 1 com
  • 指示泛型返回动态类型的对象

    这个问题是我原来问题的后续问题here https stackoverflow com questions 2541184 using a type object to create a generic 假设我有以下泛型类 简化 class
  • Microsoft.Graph - 如何从具有不同用户名的共享邮箱发送?

    我目前正在将使用 SMTP 的服务代码移植到 Office 365 通过 SMTP 我可以使用 发件人 字段在来自共享收件箱的邮件上设置不同的用户名 同时保留共享电子邮箱地址 这似乎无法通过 Office 365 运行 其工艺流程为 客户填
  • 不要声明只读可变引用类型 - 为什么不呢?

    我一直在阅读这个问题 https stackoverflow com questions 2274412 immutable readonly reference types fxcop violation do not declare r
  • 如何在 C# 中使用 XmlDsigC14NTransform 类

    我正在尝试使用规范化 xml 节点System Security Cryptography Xml XMLDsigC14nTransformC net Framework 2 0 的类 该实例需要三种不同的输入类型 NodeList Str
  • 更改其他页面的主窗口内容

    在 WPF 应用程序的主窗口中 我有一个 Badged 元素 来自材料设计 这是我的代码
  • 从包含大量文件的目录中检索文件

    我的目录包含近 14 000 000 个 wav 格式的音频样本 所有普通存储 没有子目录 我想循环浏览文件 但是当我使用DirectoryInfo GetFiles 在该文件夹上 整个应用程序冻结了几分钟 可以用另一种方式完成吗 也许读取
  • 是什么原因导致 Linq 错误:此方法无法转换为存储表达式?

    我有一堆具有相同 select 语句的 Linq to Entity 方法 所以我想我会很聪明 并将其分离到它自己的方法中以减少冗余 但是当我尝试运行代码时 我得到了以下内容错误 该方法不能转化为 商店表达式 这是我创建的方法 public
  • 当在 Repository/UnitOrWork 之上使用 Service 类时,我应该在哪里放置逻辑不适合 Repository 的常用数据访问代码?

    In my 先前的问题 https stackoverflow com questions 24906548 using the generic repository unit of work pattern in large projec
  • 为什么C语言中可以使用多个分号?

    在 C 中我可以执行以下操作 int main printf HELLO WORLD 它有效 这是为什么 我个人的想法 分号是一个 NO OPERATION 来自维基百科 指示符 拥有一大串分号与拥有一个分号并告诉 C 语句已结束具有相同的
  • 是否有任何不使用公共虚拟方法的正当理由? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 是否有任何不使用公共虚拟方法的正当理由 我在某处读到我们应该避免使用公共虚拟方法 但我想向专家确认这是否是有效的声明 对于良好且稳定的 API
  • c# 替代方案中 cfusion_encrypt 中填充的密钥是什么?

    我找到了从这里复制 C 中的 cfusion encrypt 函数的答案 ColdFusion cfusion encrypt 和 cfusion decrypt C 替代方案 https stackoverflow com questio

随机推荐

  • AngularJS - html5Mode - 无法获取/登录

    Hi 使用 yeoman grunt 和 Bower 创建了一个 angularJS 应用程序 我已经为应用程序启用了 html5Mode 它的工作原理 但是 当我刷新页面 localhost 9000 登录 时 它说 Cannot GET
  • 将字符串写成螺旋状

    我最近参加了一家公司赞助的编程比赛 有一个问题我不明白 它问的是什么 这是问题 字符串 paypal 是更快 更安全的汇款方式 写在 从左上角开始 在正方形内顺时针旋转的螺旋图案 您可能希望以固定字体显示此图案以获得更好的易读性 P A Y
  • 在 Swift 中旋转数组

    在探索 Swift 中的算法时 无法在不使用 funcs 的情况下找到 Swift 中数组旋转的算法shiftLeft shiftRight C 有一个优雅的算法 时间复杂度为 O N Function to left rotate arr
  • 如何获取Android设备屏幕尺寸?

    我有两个分辨率相同的 Android 设备 Device1 gt 分辨率 480x800 对角线屏幕尺寸 gt 4 7 英寸 Device2 gt 分辨率 480x800 对角线屏幕尺寸 gt 4 0 英寸 如何找到设备对角线屏幕尺寸 以编
  • 如何在 Javascript 中比较字符串数组?

    我想看看两个字符串数组是否相等 Eg compare abc def def abc 应该返回true同样 compare abc def def ghi 应该返回false 做这个的最好方式是什么 JavaScript 没有 Set 或
  • 在tensorflow-gpu 中“未找到‘CXXABI_1.3.8’” - 从源安装

    我已经重新安装了Anaconda2 当 python c 导入张量流 时出现以下错误 ImportError home jj anaconda2 bin lib libstdc so 6 找不到版本 CXXABI 1 3 8 home jj
  • 使用子类参数重写子类方法?

    当子类重写时 如何强制基本方法采用相同的特定子类实例 i e abstract class Animal def mateWith that Animal class Cow extends Animal override def mate
  • 如何通过 Node.js 连接到 Postgres

    我发现自己试图创建一个 postgres 数据库 所以我安装了 postgres 并启动了一个服务器initdb usr local pgsql data 然后我开始了这个实例postgres D usr local pgsql data现
  • ASP.NET MVC2 中具有 SelectList 绑定的 ViewModel

    我正在尝试为名为 Product 的 Linq2SQL 实体实现一个编辑 ViewModel 它有一个链接到品牌列表的外键 目前我正在通过 ViewData 并使用 DropDownListFor 填充品牌列表 因此 div class e
  • M1 Mac 上的 Scrapy:MemoryError:无法为 ffi.callback() 分配写入+执行内存

    我是 scrapy 新手 最近开始在 M1 MacBook Air 上使用它 我遇到了一个问题 例如 当我尝试做这样的事情时 scrapy shell bbc com 它会返回我 MemoryError 无法为 ffi callback 分
  • Spark 中有哪些不同的联接类型?

    我查看了文档 它说支持以下连接类型 要执行的连接类型 默认内 必须是以下之一 内部 交叉 外部 完整 full outer 左 left outer 右 right outer 左半 左反 我看了看堆栈溢出答案关于 SQL 连接和最上面的几
  • 将字符串的 printf 填充 0

    有没有办法将 printf 中的空格字符替换为 0 填充字段宽度 使用的代码 printf 010s this 似乎不适用于字符串 确实 0flag 仅适用于数字转换 您必须手动执行此操作 int print padleftzeroes c
  • logback.xml 应该在 SBT/Scala 项目中的哪个项目目录中?

    我有一个 SBT Scala 项目 logback 似乎可以工作 但完全忽略了我的logback xml配置文件 我已放置在src main scala logback xml 它没有任何作用 它的正确位置是什么 任何人都可以发布一个 SB
  • 由于“错误 LNK2028:无法解析的令牌...”,我无法编译解决方案

    我有一个用 C 编写的 dll 和一个用 Visual C 编写的 exe 我将 dll 中的函数声明为 string declspec dllexport ConfigureHAT T STRING pathFile 在 exe 项目中
  • 重置 Chrome DevTools 控制台上下文的方法

    Chrome gt DevTools gt console 中是否有任何功能可以清除 重置 删除在测试时声明的变量和函数 就像调用clear 清除日志一样 举个例子 我有一个用 let 关键字声明的变量 let str Hello 我通过控
  • 在测试中实例化多个 Spring Boot 应用程序

    我有几个 Spring Boot 应用程序实例 它们同时对数据库进行一些工作 每个实例都在单独的 JVM 中运行 这是一种用 Java 编写测试以在一个 JVM 上进行测试的方法吗 就像下面这样 设置一些嵌入式数据库用于测试目的 甚至只是模
  • 为什么在 AngularJS 中使用 $onInit? [复制]

    这个问题在这里已经有答案了 在 AngularJS 中 onInit函数是否可以在没有该函数的情况下进行相同的初始化 例如这个 module component myComponent controller function const c
  • 理解和可视化递归

    我在这里提到了几个有关递归的问题 但我无法理解递归如何解决这个特定问题 Python中获取字符串中所有字符组合的递归程序 st def combi prefix s if len s 0 return else st append pref
  • 是否可以在 Twitter Bootstrap 中的模态中使用“行”和“跨度”?

    我正在尝试使用 Twitter Bootstrap 中的模式来实现联系表单 理想情况下 我希望前两个字段集彼此相邻对齐 第三个字段集 包含文本区域和提交按钮 占据模式的整个宽度 我尝试使用行和跨度来使它们很好地发挥作用 但不确定如何进行此操
  • 是否应该在第二个 lambda 中重用 LINQ lambda 表达式参数?

    下列的这个问题我想知道lambda参数表达式实例的重用应该被认为是好还是坏 我有时会得到一个完整的 LINQ 表达式树 其中相同的 lambda 参数实例在第二个非嵌套 lambda 中正确使用 class Person public in