Jeb*_*bli 163 .net c# vb.net predicate
我是使用谓词的新手,刚学会了如何编写:
Predicate<int> pre = delegate(int a){ a %2 == 0 };
Run Code Online (Sandbox Code Playgroud)
谓词将返回什么,以及编程时它如何有用?
Dan*_*Tao 458
Predicate<T>
是一个功能构造,提供了一种方便的方法来基本测试给定T
对象是否属实.
例如,假设我有一个类:
class Person {
public string Name { get; set; }
public int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在让我说我有一个List<Person> people
,我想知道列表中是否有人名为奥斯卡.
如果不使用Predicate<Person>
(或Linq,或任何那些花哨的东西),我总是可以通过执行以下操作来实现此目的:
Person oscar = null;
foreach (Person person in people) {
if (person.Name == "Oscar") {
oscar = person;
break;
}
}
if (oscar != null) {
// Oscar exists!
}
Run Code Online (Sandbox Code Playgroud)
这很好,但是我想说我想检查是否有一个名叫"露丝"的人?或者年龄为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);
Run Code Online (Sandbox Code Playgroud)
请注意,我说的代码少得多,速度也不是很快.开发人员常见的误解是,如果某事需要一行,那么它必须比需要十行的东西表现更好.但是在幕后,Find
采用a 的方法Predicate<T>
毕竟只是枚举.Linq的许多功能也是如此.
那么让我们来看看你问题中的具体代码:
Predicate<int> pre = delegate(int a){ return a % 2 == 0; };
Run Code Online (Sandbox Code Playgroud)
在这里,我们有一个Predicate<int> pre
需要int a
和返回a % 2 == 0
.这主要是测试偶数.这意味着:
pre(1) == false;
pre(2) == true;
Run Code Online (Sandbox Code Playgroud)
等等.这也意味着,如果你有一个List<int> ints
并且想要找到第一个偶数,你可以这样做:
int firstEven = ints.Find(pre);
Run Code Online (Sandbox Code Playgroud)
当然,与您可以在代码中使用的任何其他类型一样,为变量提供描述性名称是个好主意; 所以我会建议改变上述pre
喜欢的东西evenFinder
或isEven
-类似的规定.然后上面的代码更加清晰:
int firstEven = ints.Find(evenFinder);
Run Code Online (Sandbox Code Playgroud)
Ree*_*sey 43
根据定义,Predicate将始终返回一个布尔值.
Predicate<T>
基本上是相同的Func<T,bool>
.
谓词在编程中非常有用.它们通常用于允许您在运行时提供逻辑,可以根据需要简单或复杂.
例如,WPF使用一个Predicate<T>
输入来过滤ListView的ICollectionView.这使您可以编写可返回布尔值的逻辑,以确定特定元素是否应包含在最终视图中.逻辑可以非常简单(只需在对象上返回一个布尔值)或非常复杂,全部取决于您.
Bra*_*iat 16
以下代码可以帮助您理解谓词的一些实际使用(与命名迭代器结合使用).
namespace Predicate
{
class Person
{
public int Age { get; set; }
}
class Program
{
static void Main(string[] args)
{
foreach (Person person in OlderThan(18))
{
Console.WriteLine(person.Age);
}
}
static IEnumerable<Person> OlderThan(int age)
{
Predicate<Person> isOld = x => x.Age > age;
Person[] persons = { new Person { Age = 10 }, new Person { Age = 20 }, new Person { Age = 19 } };
foreach (Person person in persons)
if (isOld(person)) yield return person;
}
}
}
Run Code Online (Sandbox Code Playgroud)
osi*_*2is 14
在C#中谓词只是返回布尔值的委托.当您搜索对象集合并想要特定的东西时,它们(根据我的经验)是有用的.
我最近遇到了使用第三方Web控件(比如树视图)的问题,所以当我需要在树中查找节点时,我使用.Find()方法并传递一个谓词,它将返回特定节点我是寻找.在您的示例中,如果'a'mod 2为0,则委托将返回true.当然,当我在树视图中寻找节点时,我会比较匹配的名称,文本和值属性.当委托找到匹配项时,它返回我正在寻找的特定节点.
归档时间: |
|
查看次数: |
140812 次 |
最近记录: |