.NET (五)委托第五讲:内置委托Predicate
// 摘要: // 表示定义一组条件并确定指定对象是否符合这些条件的方法。 // // 参数: // obj: // 要按照由此委托表示的方法中定义的条件进行比较的对象。 // // 类型参数: // T: // 要比较的对象的类型。 // // 返回结果: // 如果 obj 符合由此委托表示的方法中定义的条件,则为 true;否则为 false。 public delegate bool Predicate<in T>(T obj);
Predicate委托根据条件进行筛选,返回 是 或 否。
下面筛选客户名称,查询出以字母z开头的客户:
class Class5 { static void Main(String[] args) { Customer c1 = new Customer() { Name = "zhangsan", Age = 18 }; Customer c2 = new Customer() { Name = "lisi", Age = 17 }; Customer c3 = new Customer() { Name = "wangwu", Age = 20 }; Customer c4 = new Customer() { Name = "xiaoming", Age = 10 }; Customer c5 = new Customer() { Name = "zhangchao", Age = 25 }; List<Customer> list = new List<Customer>(); list.Add(c1); list.Add(c2); list.Add(c3); list.Add(c4); list.Add(c5); Predicate<Customer> predicate = new Predicate<Customer>(Choose); List<Customer> query = list.FindAll(predicate); ObjectDumper.Write(query); } public static bool Choose(Customer c) { if (c.Name.StartsWith("z")) { return true; } return false; } }
List集合中的findAll方法接受一个Predicate委托类型。
匿名委托:
//代码演进 List<Customer> query = list.FindAll(delegate(Customer c) { if (c.Name.StartsWith("z")) { return true; } return false; });
Lamada:
List<Customer> query = list.FindAll((Customer c)=> { if (c.Name.StartsWith("z")) { return true; } return false; });
总结:委托定义的是方法的类型。返回值和参数必须与方法相同。
.NET 为我们定义了4大内置委托,他们是:
Action:无返回值
Func: 有返回值
Comparison:返回整数,比较两个对象
Predicate:返回bool ,根据条件筛选
委托可以将方法作为参数传递,灵活使用委托可以让我们的程序更加简洁,结构清晰。