linq的基本功能是创建操作管道,以及这些操作需要的任何状态,这些操作表示了各种关于数据的
逻辑,如何刷选,如何排序以及如何将不同的数据源联接到一起,当linq查询在"进程内"执行的时候
那些操作通常用委托来表示:
使用linq to object来处理数据的时,经常会出现一个语句包含几个委托的情况,C sharp3 的lambda表达
式在不牺牲可读性的前提下使这一切成为可能,
简而言之:: lamada 表达式 是对linq数据管线中的操作进行表示的一种符合语言习惯的方式:
1:作为委托的lambda表达式:
从许多方面: lamada 表达式都可以看作事实C sharp2的匿名方法的一种演变 ,匿名方法能做的几乎
一切事情都可以用lamada 表达式来完成:
特别是: 捕获的变量在lambda表达式的行为和匿名方法是一样的,从显示的形式来看,两者并不大的区别,
只是lamada 表达式支持许多快捷语法,使它们更易读,更简练:
与匿名方法相似.lamada 表达式有特殊的转换规则,表达式类型的本身并非委托类型,
但它可以通过多种方式隐式或显式地转换一个委托实例:
匿名函数这个术语同时涵盖了匿名方法和lambda表达式---在很多情况下,两者可以使用相同的转换规则:
Func<string, int> returnLength;
returnLength = delegate(string text) { return text.Length; };
Console.WriteLine(returnLength("Hello"));
匿名方法是: delegate(string text) { return text.Length; };
也是打算转换成lamabda表达式的部分:
lamada 表达式最冗长的形式是:
(显式类型参数列表) => {语句}; // => 这个东东用来告诉编译器: 我们正在使用一个lambda表达式
Func<string, int> returnLength;
returnLength = (string text) => { return text.Length; };
大多数的时候: 可以用一个表达式来表示整个主体,该表达式的值是lamabda的结果:
格式即将变成:
(显式类型的参数列表 => 表达式 )
(string text=>text.length
隐式类型的参数列表
(隐式类型的参数列表) =>表达式:
隐式类型的参数列表就是一个以逗号分隔的名称列表,没有类型,但显式类型和隐式类型的
参数不能混合使用----要么整个列表都是显式类型的,要么全部是隐式类型.除此之外如果有
任何out参数或 ref参数,就只能使用显式类型:
可以继续写成:
(text)=>text.length:
单一参数的快捷语法:
如果 lamada 表达式只需一个参数,而且哪个参数可以隐式(指定)类型,C sharp3就允许省略圆括号:
这种格式的 lamada 表达式是:
参数名 => 表达式
text=>text.length:
//*****: 使用list<t>事件简单的例子:
对列表进行刷选,排序并设置其他操作:
< list><t>的findall的方法,它获取一个predicate<T>,并返回一个新列表,新列表中包含原始列表中与
谓语匹配的所有的元素:
sort方法获取一个comparision<T>,并相应地对列表进行排序,最后一个获取:foreach方法获取一个Action<T>
,对每个元素执行设置的行为:
class FilmFilteringAndSorting
{
class Film
{
public string Name { get; set; }
public int Year { get; set; }
}
static void Main()
{
var films = new List<Film>
{
new Film {Name="Jaws", Year=1975},
new Film {Name="Singing in the Rain", Year=1952},
new Film {Name=&#