Lambda表达式和委托的问题

luanning88 2017-12-02 08:38:07
private void button2_Click(object sender, EventArgs e)
{
int a = 0;
Thread obj2 = new Thread(() =>
{
for (int i = 1; i <= 100; i++)
{
a += i;
if (this.label2.InvokeRequired)
{
this.obj=adc1;
//invoke()方法,第一个参数是返回值为void的委托,第二个是给委托对应方法传递参数的
//this.label2.Invoke(new Action<string>(s => { this.label1.Text = s; }), a.ToString());
this.label2.Invoke((string s) => { this.label2.Text = s;}), a.ToString());
Thread.Sleep(200);
}
//判断是否为跨线程
//不能直接对主线程控件赋值 this.label1.Text = a.ToString();
Thread.Sleep(200);
}

});
这两句话有什么区别?我写的第二句为什么报错
static void FindListDelegate()
{
//先创建一个泛型的List类  
List<string> list = new List<string>();
list.AddRange(new string[] { "ASP.NET课程", "J2EE课程", "PHP课程", "数据结构课程" });
// Predicate<string> findPredicate = new Predicate<string>(IsBookCategory);

List<string> bookCategory = list.FindAll(new Predicate < string >( s => { s.EndsWith("课程") ? true : false; }));
foreach (string str in bookCategory)
{
Console.WriteLine("{0}\t", str);
}
}
static void FindListLambdaExpression()
{
//先创建一个泛型的List类  
List<string> list = new List<string>();
list.AddRange(new string[] { "ASP.NET课程", "J2EE课程", "PHP课程", "数据结构课程" });
//在这里,使用了Lambda来创建一个委托方法  
List<string> bookCategory = list.FindAll((string str) => str.EndsWith("课程"));
foreach (string str in bookCategory)
{
Console.WriteLine("{0}\t", str);
}
}

这次为什么 List<string> bookCategory = list.FindAll(new Predicate < string >( s => { s.EndsWith("课程") ? true : false; }));
这句话报错,而这里为什么 List<string> bookCategory = list.FindAll((string str) => str.EndsWith("课程"));
这句话不报错
...全文
227 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
秋的红果实 2017-12-02
  • 打赏
  • 举报
回复
List<string> bookCategory = list.FindAll(new Predicate < string >( s => { s.EndsWith("课程") ? true : false; })); ==> 首先要知道Predicate委托是干嘛的 Predicate < string >表示接受string参数,返回bool类型的值,true or false 你这句,List<string>,list里是要存放string的,而不是bool,改成List<bool>应该不会报错了
exception92 2017-12-02
  • 打赏
  • 举报
回复
第二种不是标准的委托形式,它的写法就是普通方法的传参的写法,而编译器不认为它是delegate。匿名表达式中的参数类型编译器会自动推断出来,即类似:m=>m.xx,这个表达式就是predicate的表示,但这个不需要显示new出来的。 (string str)=> 这种是指明了参数类型为string 其实就是 str=> 这个编译器会自动推断出str的类型。 ps:个人观点

110,529

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧