C# Lambda 表达式:为什么应该使用它们?

2024-03-03

我很快读完了微软 Lambda 表达式 http://msdn.microsoft.com/en-us/library/bb397687.aspx文档。

不过,这种例子帮助我更好地理解:

delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25

尽管如此,我还是不明白为什么这是一项创新。它只是一个当“方法变量”结束时就消亡的方法,对吗?为什么我应该使用这个而不是真正的方法?


Lambda 表达式 http://weblogs.asp.net/scottgu/archive/2007/04/08/new-orcas-language-feature-lambda-expressions.aspx是匿名委托的更简单语法,可以在可以使用匿名委托的任何地方使用。然而,事实并非如此。 lambda 表达式可以转换为表达式树,这允许像 LINQ to SQL 一样发挥很多作用。

以下是一个示例LINQ 到对象 http://msdn.microsoft.com/en-us/library/bb397919.aspx使用匿名委托的表达式然后使用 lambda 表达式来显示它们是多么容易理解:

// anonymous delegate
var evens = Enumerable
                .Range(1, 100)
                .Where(delegate(int x) { return (x % 2) == 0; })
                .ToList();

// lambda expression
var evens = Enumerable
                .Range(1, 100)
                .Where(x => (x % 2) == 0)
                .ToList();

Lambda 表达式和匿名委托比编写单独的函数有一个优势:它们实现closures http://en.wikipedia.org/wiki/Closure_(computer_science)这可以让你将本地状态传递给函数而不添加参数 http://www.srtsolutions.com/Looking-Inside-C-Closures函数或创建一次性对象。

表达式树 http://www.interact-sw.co.uk/iangblog/2005/09/30/expressiontrees是 C# 3.0 的一个非常强大的新功能,它允许 API 查看表达式的结构,而不仅仅是获取对可以执行的方法的引用。 API 只需将委托参数放入Expression<T>参数,编译器将从 lambda 而不是匿名委托生成表达式树:

void Example(Predicate<int> aDelegate);

称为:

Example(x => x > 5);

becomes:

void Example(Expression<Predicate<int>> expressionTree);

后者将通过代表抽象语法树 http://en.wikipedia.org/wiki/Abstract_syntax_tree描述了这个表达式x > 5。 LINQ to SQL 依靠此行为能够将 C# 表达式转换为服务器端过滤/排序等所需的 SQL 表达式。

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

C# Lambda 表达式:为什么应该使用它们? 的相关文章

  • 在 C# 中按元素相乘数组具有意想不到的性能

    我想找到按元素相乘两个数组的最佳方法 这是更广泛项目的一部分 其中性能而不是唯一的考虑因素 我今天开始用 C Linqpad 编写一些函数 因此它还没有以任何方式进行优化 下面代码的输出如下 Environment ProcessorCou
  • 如何保证对象只有一个线程

    我有以下代码 class Service public void start creates thread which creates window and goes to message loop void stop sends WM C
  • FileStream 构造函数和默认缓冲区大小

    我们有一个使用 NET 4 用 C 编写的日志记录类 我想添加一个构造函数参数 该参数可以选择设置文件选项 WriteThrough http msdn microsoft com en us library system io fileo
  • 为什么在创建矩阵类时使用向量不好?

    对于我的矩阵类 我做了 template
  • 如何在 C# / .NET 中创建内存泄漏[重复]

    这个问题在这里已经有答案了 可能的重复 托管代码中是否可能存在内存泄漏 特别是 C 3 0 https stackoverflow com questions 6436620 is it possible to have a memory
  • 平滑滚动.net 表单

    您好 我正在 net 中使用表单 并且在运行时动态添加大量链接标签 我将这些链接标签添加到面板并将该面板添加到 winform 当链接标签的数量增加时 表单会显示一个自动滚动条 垂直 现在 当我使用自动滚动向下滚动时 表单在滚动时不会更新其
  • 类特定的新删除运算符是否必须声明为静态

    标准中是否要求类特定的 new new delete 和 delete 是静态的 我可以让它们成为非静态成员运算符吗 为什么需要它们是静态的 它们被隐式声明为静态 即使您没有键入 static
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类
  • 如何从文本文件读取整数到数组

    这就是我想做的 我对此有些不满 但我希望你能容忍我 这对我来说是一个非常新的概念 1 在我的程序中 我希望创建一个包含 50 个整数的数组来保存来自文件的数据 我的程序必须获取用户的文档文件夹的路径 2 文件的名称为 grades txt
  • 如何在服务器端按钮点击时关闭当前标签页?

    我尝试在确认后关闭当前选项卡 因此我将以下代码放在确认按钮的末尾 但选项卡没有关闭 string jScript ClientScript RegisterClientScriptBlock this GetType keyClientBl
  • 将二进制数据从 C# 上传到 PHP

    我想将文件从 Windows C 应用程序上传到运行 PHP 的 Web 服务器 我知道 WebClient UploadFile 方法 但我希望能够分块上传文件 以便我可以监控进度并能够暂停 恢复 因此 我正在读取文件的一部分并使用 We
  • ASP.NET MailMessage.BodyEncoding 和 MailMessage.SubjectEncoding 默认值

    很简单的问题 但我在 MSDN 上找不到答案 查找 ASP NET 将用于的默认值 MailMessage BodyEncoding and MailMessage SubjectEncoding 如果你不在代码中设置它们 Thanks F
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • 跨多个域的 ASP.NET 会话

    是否有合适的 NET 解决方案来在多个域上提供持久服务器会话 即 如果该网站的用户在 www site1 com 下登录 他们也将在 www site2 com 下登录 安全是我们正在开发的程序的一个问题 Thanks 它是否需要在会话中
  • 更改 Windows Phone 系统托盘颜色

    有没有办法将 Windows Phone 上的系统托盘颜色从黑色更改为白色 我的应用程序有白色背景 所以我希望系统托盘也是白色的 您可以在页面 XAML 中执行此操作
  • 矩阵到数组 C#

    这将是转换方阵的最有效方法 例如 1 2 3 4 5 6 7 8 9 into 1 2 3 4 5 6 7 8 9 in c 我在做 int array2D new int 1 2 3 4 5 6 7 8 9 int array1D new
  • 在简单注入器中解析具有自定义参数的类

    我正在使用以下命令创建 WPF MVVM 应用程序简易注射器作为 DI 容器 现在 当我尝试从简单注入器解析视图时遇到一些问题 因为我需要在构造时将参数传递到构造函数中 而不是在将视图注册到容器时 因此这不是适用的 简单注入器将值传递到构造
  • 将 char[][] 转换为 char** 会导致段错误吗?

    好吧 我的 C 有点生疏了 但我想我应该用 C 来做我的下一个 小 项目 这样我就可以对其进行抛光 并且我已经有不到 20 行的段错误了 这是我的完整代码 define ROWS 4 define COLS 4 char main map
  • 使用 QtWebEngine 将 C++ 对象暴露给 Qt 中的 Javascript

    使用 QtWebkit 可以通过以下方式将 C 对象公开给 JavascriptQWebFrame addToJavaScriptWindowObject如中所述https stackoverflow com a 20685002 5959
  • xsi:type 属性搞乱了 C# XML 反序列化

    我使用 XSD exe 根据 XML 架构 xsd 文件 自动生成 C 对象 我正在反序列化 OpenCover 输出 但其中一个部分类未正确生成 这是导致异常的行

随机推荐

  • Spark 的 StreamingLinearRegressionWithSGD 是如何工作的?

    我正在研究StreamingLinearRegressionWithSGD https spark apache org docs 1 6 3 api java org apache spark mllib regression Strea
  • 获取 Android 设备的方向

    您可能会认为会有一个直接的解决方案 Android 文档指出 Android 2 2 API 级别 8 中已弃用方向传感器 我们建议不要使用来自方向传感器的原始数据 您将 getRotationMatrix 方法与 getOrientati
  • 从 Angular 2 组件中的 CDN 加载 css

    正如标题所说 我想在 Angular 2 组件中包含外部 css 我现在是这样做的 import Component OnInit from angular core Component selector app auth template
  • 将绘图保存在对象中

    In ggplot2 可以轻松地将图形保存到 R 对象中 p ggplot geom point does not display the graph p displays the graph 标准功能plot将图形生成为 void 函数并
  • Web API 在几次成功请求后突然返回 403 禁止

    我一直致力于与 ASP NET Web API 结合使用的离子应用程序 我正在使用该 API 进行所有数据传输 我遇到了一个问题 在几次成功的请求之后 API突然返回403禁止 看起来 API 有一个限制或者其他什么 因为当我在很短的时间内
  • Python + Sqlite 的字符串相似度(Levenshtein 距离/编辑距离)

    Python Sqlite 中是否有可用的字符串相似性度量 例如使用sqlite3模块 用例示例 import sqlite3 conn sqlite3 connect memory c conn cursor c execute CREA
  • 占位符在 select2 中不起作用

    我在工作Select2选择框 Problem 占位符未显示在select2 它始终显示在中选择的第一个选项select2 它会自动选择我想显示占位符而不是它的第一个选项 My Code Script
  • Zend URL 参数 - 隐藏键和显示值

    使用 Zend 的默认路由 URL 如下所示 www domain com controller action key1 value1 key2 value2 key3 value3 每个键和值都作为一对存储在返回的数组中getParams
  • ReactJS-下载pdf文件“失败-无文件”

    我编写了一个 React 组件来使用文件的锚标记下载 pdf 文件 我收到错误Failed No file import React from react const Links gt div a href https github com
  • vscode - 将一个分支合并到另一个分支

    是否可以使用 vscode 界面而不是终端将一个分支合并到另一个分支 或者是否有任何扩展可以实现这一点 使用 vscode v1 13 0提前致谢 我创建了一个扩展 其名称如下 git合并 https marketplace visuals
  • 在 OpenShift(红帽云)上每 5 分钟运行一次 CRON 作业

    我试图每 5 分钟运行一次这个脚本 在 OpenShift 上运行 CRON 作业的唯一方法似乎是使用他们的 CRON 插件 而且CRON插件只允许每分钟 每小时和每天的脚本 通过将脚本放在相应的文件夹中 我尝试每 5 分钟运行一次此脚本
  • UINT_MAX 是否将所有位设置为 1?

    这个问题以前被问过 但我仍然很困惑 我知道 unsigned int a 1 将会UINT MAX 但这并不是因为所有 1 位都已设置 C11 说 如果新类型是无符号的 则通过重复添加或来转换该值 比新类型可以表示的最大值减一 直到该值在新
  • 向每个处理程序添加响应标头,而不重复同一行

    我正在编写一个小型网站 对于每个页面 我都将服务器名称添加到其标题中 func httpSignUp rw http ResponseWriter req http Request rw Header Set Server SERVER N
  • 如何使用自定义形状的 fab 按钮制作 Bottombar?

    我想制作一个带有附加 fab 按钮的底栏 如下图所示 如果有人知道那种带有 fab 底部的不同形状按钮库 请向我推荐 下面给出的图像用这样的 fab 制作了一个底栏 这只是一个可以改进代码的想法 您可以更改形状FloatingActionB
  • 如何有条件地从 .NET 集合中删除项目

    我正在尝试在 NET 中编写一个扩展方法 它将对通用集合进行操作 并从集合中删除与给定条件匹配的所有项目 这是我的第一次尝试 public static void RemoveWhere
  • 如何用 C 语言为 PIC24 编写与硬件无关的函数

    我正在编写一些实现各种功能的代码 例如 PID 控制器 信号发生器等 我的硬件提供各种输入和输出 刚才我有大量 SWITCH 语句来确定计算的源和目的地 例如 对于 PID 控制器 每 100ms 有一个开关命令 决定将哪个输入传递给 pi
  • 如何通过 PHP 发布到 Google Plus? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想知道是否已经有一个浮动的非官方 PHP 库或类 我可以使用它来发布到用户的 Google Plus
  • 如果不存在则删除表空间

    我已经编写了 pl sql 脚本 可以工作 但看起来不太好 DECLARE v exists NUMBER BEGIN SELECT count INTO v exists FROM dba tablespaces WHERE tables
  • 将结果集从 SQL 数组转换为字符串数组

    我正在查询information schema columns我的 PostgreSQL 数据库中的表 使用表名 结果集查找所有列名 类型以及是否可为空 主键 id 除外 这是正在使用的查询 SELECT column name is nu
  • C# Lambda 表达式:为什么应该使用它们?

    我很快读完了微软 Lambda 表达式 http msdn microsoft com en us library bb397687 aspx文档 不过 这种例子帮助我更好地理解 delegate int del int i del myD