这个问题在这里已经有了答案:





Predicate Delegates in C#

(10 个回答)


7年前关闭。




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

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

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

最佳答案

Predicate<T> 是一个函数式构造,它提供了一种基本测试给定 T 对象是否正确的便捷方法。

例如假设我有一个类:

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

现在假设我有一个 List<Person> people,我想知道列表中是否有人叫 Oscar。

不使用 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 岁的人?

使用 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);

请注意,我说的代码要少得多,而不是快得多。开发人员的一个常见误解是,如果某样东西只需要一行,它的性能肯定比需要 10 行的东西更好。但在幕后, 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 更改为 evenFinderisEven 之类的东西 - 沿着这些路线。那么上面的代码就清晰了很多:
int firstEven = ints.Find(evenFinder);

关于c# - c#中的谓词是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1710301/

10-13 00:22