我对使用谓词非常陌生,刚刚学会了如何编写:
Predicate<int> pre = delegate(int a){ a %2 == 0 };
谓词将返回什么,它在编程时有什么用处?
Predicate<T>是一种功能构造,提供了一种方便的方法,可以基本测试给定T对象是否为真。
Predicate<T>
T
例如假设我有一个类:
class Person { public string Name { get; set; } public int Age { get; set; } }
现在假设我有一个List<Person> people,我想知道列表中是否有人叫 Oscar。
List<Person> people
在不 使用Predicate<Person>(或 Linq 或任何花哨的东西)的情况下,我总是可以通过执行以下操作来完成此操作:
Predicate<Person>
Person oscar = null; foreach (Person person in people) { if (person.Name == "Oscar") { oscar = person; break; } } if (oscar != null) { // Oscar exists! }
这很好,但是假设我想检查是否有一个名为“Ruth”的人?还是一个17岁的人?
使用 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);
注意我说的 代码少 了很多,而不是 快 了很多。开发人员有一个常见的误解是,如果某件事情需要一行代码,那么它的性能肯定比需要十行代码的事情要好。但在幕后,Find需要 a 的方法Predicate<T>毕竟只是枚举。Linq 的许多功能也是如此。
Find
那么让我们看一下您问题中的具体代码:
Predicate<int> pre = delegate(int a){ return a % 2 == 0; };
在这里,我们有一个Predicate<int> pre接受int a和返回的 a a % 2 == 0。这本质上是对偶数的测试。这意味着:
Predicate<int> pre
int a
a % 2 == 0
pre(1) == false; pre(2) == true;
等等。这也意味着,如果你有一个List<int> ints并且你想找到第一个偶数,你可以这样做:
List<int> ints
int firstEven = ints.Find(pre);
当然,与您可以在代码中使用的任何其他类型一样,给变量提供描述性名称是个好主意;所以我建议将上述内容更改pre为类似evenFinder或isEven- 类似的内容。那么上面的代码就清晰了很多:
pre
evenFinder
isEven
int firstEven = ints.Find(evenFinder);