LINQ基础
LINQ ( Language Integrated Query ) 即 语 言 集 成 查 询
LINQ 是 一 组 语 言 特 性 和 API, 使 得 你 可 以 使 用 统 一 的 方 式 编 写 各 柿 查 询 。 查 询 的 对 象 包 括 XML 、 对 象 集 合 、 SQLServer 数 据 库 等 等 。
LINQ主 要 包 含 以 下 三 部 分 :
LINQ to Objects 主 要 负 责 对 象 的 查 询
LINQ to XM L 主 要 负 责 XML 的 查
LINQ to ADO.NET 主 要 负 责 数 据 库 的 查询 ( LINQ to SQL )
LINQ组成
查询实例:从numbers数组中提取偶数并降序排列
不使用LINQ
Int[] numbers = new int [ ]{ 6 , 4,3, 2 , 9 , 1 , 7 , 8 ,5 }
List <int> even = new Llst <int> ();
foreach(Int number in numbers)
{
if (number % 2 == 0 )
{
Even.Add(number);
}
}
使用LINQ
Int[] numbers = new int [ ] { 6 , 4, 3, 2 , 9 , 1 , 7 , 8 ,5 }
Var even= numbers
Where (p = > p % 2 == 0 )
Select(p => p)
OrderByDescending (p => p) ;
代码分析
lambda表达式的发展
定义委托
delegatestring Processstrlng( string Input )
委托可以理解为一个函数指针,它定义了一个函数的原型委托的实例化和使用。
匿名方法
在C#2.0中加入了匿名方法特性
ProcessString p = delegate ( stringinput ) //string input 是参数列表
{
return input TOLower(); //方法体
};
Console. WriteLine( p ( "ABCD ” )); //"ABCD",这里没有了具体的方法名称,因此成为匿名方法
lambda表达式
在C#3.0中,继匿名方法之后加入了更加简洁的lambda表达式
ProcessString p =input=> input ToLower () ;
Console. WriteLine( P ("ABCD ” ));
lambda表达上语法
(参数列表) => {方法体}
参数列表中的参数类型可以是明确类型或者推断类型,如果是推断类型,则参数的数据类型将由编译器根据上下文自动推断出来。
lambda表达式的简写方式:如果参数列表只包含一个推断或者方法体中只包含一条语句时,就可以不用括号括起来
参 数 列 表 => 方 法 体 /(参数列表) => 方法体 / 参数列表 => {方法体}
Lambda 与 匿 名 方 法 的 关 系
总 体 上 说 , 匿 名 方 法 可 以 看 作 是 Lambda 表 达 式 的 功 能 子 集 , 但 是 两 者 存 在 以 下 区 别 :
Lambda 表 达 式 的 参 数 允 许 不 指 明 参 数 类 型 , 而 匿 名 方 法 的 参 数 必 须 明 确 指 明参数 类 型
Lambda 表 达 式 的 方 法 体 允 许 由 单 一 表 达 式 或多条语 句 组 成 , 而 匿 名 方 法 不 允 许 单 一 表 达 式形式。
学习LINQ以及lambda表达式可以通过一个小软件:LINQpad