C# 中的谓词是什么? [复制]

2023-12-05

我对使用谓词非常陌生,刚刚学会了如何编写:

Predicate<int> pre = delegate(int a){ a %2 == 0 };

谓词将返回什么?它在编程时有何用处?


Predicate<T>是一个函数式构造,提供了一种方便的方法来基本测试给定的某件事是否正确T object.

例如假设我有一堂课:

class Person {
    public string Name { get; set; }
    public int Age { get; set; }
}

现在假设我有一个List<Person> people我想知道名单上是否有叫奥斯卡的人。

Without用一个Predicate<Person>(或者 Linq,或者任何那些奇特的东西),我总是可以通过执行以下操作来完成此任务:

Person oscar = null;
foreach (Person person in people) {
    if (person.Name == "Oscar") {
        oscar = person;
        break;
    }
}

if (oscar != null) {
    // Oscar exists!
}

这很好,但是假设我想检查是否有一个名为“Ruth”的人?还是17岁的人?

Using a Predicate<Person>,我可以使用更少的代码找到这些东西:

Predicate<Person> oscarFinder = (Person p) => { return p.Name == "Oscar"; };
Predicate<Person> ruthFinder = (Person p) => { return p.Name == "Ruth"; };
Predicate<Person> seventeenYearOldFinder = (Person p) => { return p.Age == 17; };

Person oscar = people.Find(oscarFinder);
Person ruth = people.Find(ruthFinder);
Person seventeenYearOld = people.Find(seventeenYearOldFinder);

注意我说了很多更少的代码, 不是很多faster。开发人员的一个常见误解是,如果某个东西只需要一行,那么它的性能一定比需要十行的东西要好。但在幕后,Find方法,该方法需要一个Predicate<T>,毕竟只是列举而已。 Linq 的许多功能也是如此。

那么我们来看看你问题中的具体代码:

Predicate<int> pre = delegate(int a){ return a % 2 == 0; };

在这里我们有一个Predicate<int> pre这需要一个int a并返回a % 2 == 0。这本质上是测试偶数。这意味着:

pre(1) == false;
pre(2) == true;

等等。这也意味着,如果您有List<int> ints如果你想找到第一个偶数,你可以这样做:

int firstEven = ints.Find(pre);

当然,与您可以在代码中使用的任何其他类型一样,最好为变量提供描述性名称;所以我建议改变上面的内容pre类似的东西evenFinder or isEven——类似的事情。那么上面的代码就清晰很多了:

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

C# 中的谓词是什么? [复制] 的相关文章

随机推荐

  • 在其中创建 Angular 生命周期挂钩的 Highcharts 实例

    我目前正在使用 Angular 7 高图表API 我使用以下方法集成了 Highcharts官方 Github 链接 有一个callbackFunction在 Highcharts 中我们可以使用它来获取图表实例 但是 我还没有弄清楚两件事
  • 如何选择要在 TensorBoard 的嵌入选项卡中查看的检查点?

    简短的问题 如何选择在 TensorBoard 的嵌入选项卡中查看哪个检查点 问题的较长版本 我想用 TensorBoard 可视化词嵌入 为此 在阅读完官方教程 mirror 我添加了以下代码 embedding writer tf su
  • 调用托管属性的 getter 时出现 NPE

    我正在使用 Hibernate 学习 Spring 并使用 JSF 作为前端框架创建一个电影租赁应用程序 我的注册 bean 中有一个应用程序范围的托管属性 它是视图范围的 在里面register 方法将用户详细信息插入数据库中 我调用服务
  • C 代码中的内联汇编语句和适用于 ARM Cortex 架构的扩展 ASM

    我正在尝试编译以下两段代码ARM编译器5对于 Cortex A 微处理器 Part 1 static inline void cp15 write sctlr uint32 t value asm mcr p15 0 0 c1 c0 0 r
  • jQuery 与 ASP.NET WebForms - 禁用文本框

    另一个 jQuery 新手问题 我做错了什么 我有一些由 ASP NET 3 5 Webforms 呈现的 HTML 标记 如下所示
  • 更新 Android 联系人提供程序中的联系人图像

    我创建一个应用程序来读取 更新 删除联系人详细信息 这是更新 Contact Image 时出现的问题 当应用程序外部的设备添加新联系人时 没有图像 那么我们就无法更新联系人图片 我的更新代码是 ops add ContentProvide
  • 使用一个全局资源在 ASP.NET Web 表单中进行本地化

    我想要一些这样的资源文件 Mui resx Mui fr resx Mui es resx 我希望能够在我的代码隐藏中做这样的事情 Label1 Text Mui Hello 在我的 aspx 中是这样的 有人知道该怎么做吗 是否可以 对的
  • 如何从 VB.NET 打开 Outlook“新邮件”窗口

    我有一个场景 用户可以从网格中进行选择 已将文件上传到本地文件夹 当用户按 发送 时 应用程序应打开 Outlook 新邮件消息 窗口 其中选择的文件作为附件 用户选择的文件 来自网格 任何帮助将不胜感激 Imports System Di
  • 如何在 J2ME 中修改 XML 的值?

    假设有一个XML in my J2ME应用
  • CImg 的编译错误

    我是第一次使用 CImg 库 在使用仅包含 CImg h 的简单测试程序时出现编译错误 这是为什么 我怎样才能解决这个问题 程序代码 include headers CImg h using namespace cimg library i
  • Firebase 电子邮件验证不适用于 ActionCodeSetting

    我正在尝试实现对用户电子邮件的验证 使用电子邮件模板中的默认验证 URL 以及 ActionCodeSetting URL 动态链接 以将用户带回应用程序 我对 Firebase 的 ActionCodeSetting 电子邮件验证应该如何
  • 如何删除firestore集合数据库中的所有文档

    我使用 Firestore 数据库来存储和检索数据 每天晚上 Firestore 集合中都需要有新的数据集 文档 可用 那么有没有办法一次性完全删除集合中的所有现有文档 我尝试了那里的文档 它说我们需要一一删除 这是不可能的 因为文档ID是
  • 如何在 WinRT 中将字符串绘制到位图图像

    如何在图像中绘制字符串winRT 在 WinForms 中可以使用drawstring 里面的方法system drawing命名空间 但我在 WinRT API 中找不到其等效项 在 Windows 8 1 中 它们最终支持将 XAML
  • 如何在 PHP 中创建 Hashcash

    在网上搜索后 我找不到有关如何在 php 中创建哈希码的答案 我正在编写新闻通讯工具 但不想被列入黑名单 好吧 谁想要 我已经检查过我的反向 DNS SPF 和 spamhaus org 有人可以帮助我如何在 PHP 中创建 hashcas
  • Qt 5.8 和 Pdf.js 错误

    我的 pdf js 和 Qt 5 8 有问题 我尝试在此链接中执行相同的代码在 Qt5 8 中使用 pdf js在我的应用程序中 但他不工作我不知道为什么 qt向我显示这条关于JS的消息 js 未捕获类型错误 无法读取未定义的属性 PDFJ
  • Angular:更新服务并在控制器之间共享数据

    我正在使用服务从 API 获取一些数据 angular module myApp factory myService function q timeout var getMessages function var deferred q de
  • 如何在循环下的 markdown (knitr) 中包含多个plot3d

    我正在循环中使用plot3d rgl 绘制 3d 图表 knit rgl hooks 对于单个 3d 图形工作得很好 但在循环中使用时 markdown 文件不包含 3d 图形 另一种解决方案是包含多个rglwidget 价值观 你需要把它
  • 错误:将标头发送到客户端后无法设置标头

    我对 Node js 还很陌生 并且遇到了一些问题 我正在使用 Node js 4 10 和 Express 2 4 3 当我尝试访问时http 127 0 0 1 8888 auth facebook 我将被重定向到http 127 0
  • 为什么循环引用和递归会使我的程序失败?

    我写了这个简单的 Prolog 程序 man socrates mortal X man X immortal X immortal X 我问了它一些常见的问题 比如苏格拉底是不是一个人 或者苏格拉底是否是一个凡人 man socrates
  • C# 中的谓词是什么? [复制]

    这个问题在这里已经有答案了 我对使用谓词非常陌生 刚刚学会了如何编写 Predicate