C#中的委托,匿名方法和Lambda表达式(转载)
2010-10-12 20:46
387 查看
本文转载自/article/4950361.html
代码 1 List<string> list = new List<string>();
2 IQueryable<string> query = list.AsQueryable();
3 list.Add("one");
4 list.Add("two");
5 list.Add("three");
6
7 string foo = list.First(x => x.EndsWith("o"));
8 string bar = query.First(x => x.EndsWith("o"));
9 // foo and bar are now both 'two' as expected
10 foo = list.First(x => { return x.EndsWith("e"); }); //no error
11 bar = query.First(x => { return x.EndsWith("e"); }); //error
12 bar = query.First((Func<string,bool>)(x => { return x.EndsWith("e"); })); //no error
倒数第二行在编译时失败。这是因为IQueryable.First期望得到一个表达式作为参数,然而List<T>.First期望得到一个委托。你可以按照最后一行强制转换Lambda到一个委托(使用First的方法重载)。 这里很难结束讨论,但是我觉得必须停止。Lambda大体上分为两类:一类创建匿名方法和委托;另一类创建表达式。表达式自成一体,并不是.NET开发者的必备知识(无疑在LINQ中已有实现)。
备注:
此文为CodeProject上的同名文章<C# Delegates,Anonymous Methods, and Lambda Expressions>,个人觉得非常好,所以就翻一下给不想看英文的同学。由于能力有限,翻译的不好,
望大家多多包涵。
[/code]
简介
在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆。我想下面的代码能证实这点。下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个First不仅被编译,并都获得正确答案,且他们的结果一样。如果你对此感到困惑,那么请继续看这篇文章。代码 1 List<string> list = new List<string>();
2 IQueryable<string> query = list.AsQueryable();
3 list.Add("one");
4 list.Add("two");
5 list.Add("three");
6
7 string foo = list.First(x => x.EndsWith("o"));
8 string bar = query.First(x => x.EndsWith("o"));
9 // foo and bar are now both 'two' as expected
10 foo = list.First(x => { return x.EndsWith("e"); }); //no error
11 bar = query.First(x => { return x.EndsWith("e"); }); //error
12 bar = query.First((Func<string,bool>)(x => { return x.EndsWith("e"); })); //no error
倒数第二行在编译时失败。这是因为IQueryable.First期望得到一个表达式作为参数,然而List<T>.First期望得到一个委托。你可以按照最后一行强制转换Lambda到一个委托(使用First的方法重载)。 这里很难结束讨论,但是我觉得必须停止。Lambda大体上分为两类:一类创建匿名方法和委托;另一类创建表达式。表达式自成一体,并不是.NET开发者的必备知识(无疑在LINQ中已有实现)。
备注:
此文为CodeProject上的同名文章<C# Delegates,Anonymous Methods, and Lambda Expressions>,个人觉得非常好,所以就翻一下给不想看英文的同学。由于能力有限,翻译的不好,
望大家多多包涵。
[/code]
相关文章推荐
- C#中的委托,匿名方法和Lambda表达式
- 写的非常好的文章 C#中的委托,匿名方法和Lambda表达式
- C#中的委托,匿名方法和Lambda表达式
- C#中的委托,匿名方法和Lambda表达式
- C# 入门(9) 委托(delegate),匿名方法,Lambda表达式
- 再谈C#中的委托,匿名方法和Lambda表达式
- (装载)C#中的委托,匿名方法和Lambda表达式
- C# 委托用法、匿名方法、Lambda表达式
- c#之委托、匿名方法、Lambda表达式
- C#中的委托,匿名方法和Lambda表达式
- 委托是什么?匿名方法是什么?在C# 3.0中,Lambda表达式是什么?扩展方法是什么?LINQ是什么?您觉得C# 3.0中还有哪些重要的特性,它们带来了什么优势?BCL中哪些类库和这些特性有关?您平时最常用哪些
- C#中的委托,匿名方法、泛型委托和Lambda表达式表达式演变过程
- C# 匿名方法和拉姆达表达式 (2012-04-27 23:27:15)转载▼ 标签: 杂谈 匿名方法本质上是一传递给委托的代码块,是使用委托的另一种方法。 规则: 1、匿名方法中不能使用跳转语句跳
- C#中的委托,匿名方法和Lambda表达式
- (转)C#中的委托,匿名方法和Lambda表达式
- C#学习日记25---匿名方法 与 Func委托 与 lambda表达式
- (转)C#中的委托,匿名方法和Lambda表达式
- 【转】C#中的委托,匿名方法和Lambda表达式
- C#中的委托,匿名方法和Lambda表达式
- C#中的委托,匿名方法和Lambda表达式