LINQ学习笔记及总结(1)

// 【一个比较简单的需求,找出年龄大于25小于30的Person】
List < Person >  lpsTmp  =   new  List < Person > {
    
new  Person{ID = 1000 ,Name = " A " ,Age = 24 },
    
new  Person{ID = 1001 ,Name = " B " ,Age = 26 },
    
new  Person{ID = 1002 ,Name = " C " ,Age = 28 },
    
new  Person{ID = 1003 ,Name = " D " ,Age = 30 },
    
new  Person{ID = 1004 ,Name = " E " ,Age = 32 }
};
// -------------------------------------------------------
// 【方式1】如果是在net1.1(1.1中还没有引入泛型概念)或2.0中,直接遍历
Console.WriteLine( " 方式1 " );
foreach  (Person p  in  lpsTmp)
{
    
if  (p.Age  >   25   &&  p.Age  <   30 )
    {
        Console.WriteLine(
string .Format( " {0}'s ID is {1},{2} years old " , p.Name, p.ID, p.Age));
    }
}
// -------------------------------------------------------


// -------------------------------------------------------
// 【方式2】使用List的FindAll来实现,这里主要用到了2.0里的Predicate泛型委托
//  Predicate可以省略
Console.WriteLine( " \r\n方式2 " );
lpsTmp.FindAll(
new  Predicate < Person > (FindMatchPerson2));
//
lpsTmp.FindAll(FindMatchPerson2);
// -------------------------------------------------------


// -------------------------------------------------------
// 【方式3】方式2中我们需要额外的定义一个方法用来匹配集合中的对象
// 我们可以使用更简洁的语法,那就是匿名方法, Predicate可以省略
Console.WriteLine( " \r\n方式3 " );
lpsTmp.FindAll(
new  Predicate < Person > ( delegate (Person p)
{
    
if  (p.Age  >   25   &&  p.Age  <   30 )
    {
        Console.WriteLine(
string .Format( " {0}'s ID is {1},{2} years old " , p.Name, p.ID, p.Age));
        
return   true ;
    }
    
return   false ;

}));
//
lpsTmp.FindAll( delegate (Person p) {  return   true ; });
// -------------------------------------------------------


// -------------------------------------------------------
// 【方式4】方式3中我们通过匿名方法避免了去定义一个额外的判断方法
// 接下来我们来使用lambda表达式实现同样的效果
// Lambda表达式实际上为书写匿名方法提供了一种更加简单、更加函数化的语法
Console.WriteLine( " \r\n方式4 " );
var lsps4 
=  lpsTmp.FindAll( new  Predicate < Person > (p  =>  p.Age  >   25   &&  p.Age  <   30 ));
//
lsps4  =  lpsTmp.FindAll(p  =>  p.Age  >   25   &&  p.Age  <   30 );
foreach  (Person p  in  lsps4)
    Console.WriteLine(
string .Format( " {0}'s ID is {1},{2} years old " , p.Name, p.ID, p.Age));
// -------------------------------------------------------


// -------------------------------------------------------
// 【方式5】接下来我们使用Linq的一些静态方法,实际上List的一些扩展方法,Func可以省略
Console.WriteLine( " \r\n方式5 " );
var lsps5 
=  System.Linq.Enumerable.Where(lpsTmp,  new  Func < Person,  bool > (FindMatchPerson2)).ToList();
//
lsps5  =  System.Linq.Enumerable.Where(lpsTmp, FindMatchPerson2).ToList();

// 上面的【方式5】与【方式2】比较类似,都是委托给FindMatchPerson2来执行
// 下同【方式3】,使用了匿名方法,可以省略Func
lsps5  =  System.Linq.Enumerable.Where(lpsTmp,  new  Func < Person,  bool > ( delegate (Person ppTmp)
{
    
if  (ppTmp.Age  >   25   &&  ppTmp.Age  <   30 )
    {
        Console.WriteLine(
string .Format( " {0}'s ID is {1},{2} years old " , ppTmp.Name, ppTmp.ID, ppTmp.Age));
        
return   true ;
    }
    
return   false ;
})).ToList();
// 下同【方式4】,使用lambda表达式,可以省略Func
lsps5  =  System.Linq.Enumerable.Where(lpsTmp,  new  Func < Person,  bool > (p  =>  p.Age  >   25   &&  p.Age  <   30 )).ToList();
// -------------------------------------------------------


// -------------------------------------------------------
// 【方式6】接下来我们使用List的一些扩展方法,这主要是为了接下来使用Linq做个铺垫
// 因为linq的本质就是使用扩展方法扩展了对集合类型的各种查询方法,Func可以省略
Console.WriteLine( " \r\n方式6 " );
var lsps6 
=  lpsTmp.Where( new  Func < Person,  bool > (FindMatchPerson2)).ToList();
//
lsps6  =  lpsTmp.Where(FindMatchPerson2).ToList();

// 上面的【方式6】与【方式2】比较类似,都是委托给FindMatchPerson2来执行
// 下同【方式3】,使用了匿名方法,可以省略Func
lsps6  =  lpsTmp.Where( new  Func < Person,  bool > ( delegate (Person ppTmp)
{
    
if  (ppTmp.Age  >   25   &&  ppTmp.Age  <   30 )
    {
        Console.WriteLine(
string .Format( " {0}'s ID is {1},{2} years old " , ppTmp.Name, ppTmp.ID, ppTmp.Age));
        
return   true ;
    }
    
return   false ;
})).ToList();
// 下同【方式4】,使用lambda表达式,可以省略Func
lsps6  =  lpsTmp.Where( new  Func < Person,  bool > (p  =>  p.Age  >   25   &&  p.Age  <   30 )).ToList();
// -------------------------------------------------------


// -------------------------------------------------------
// 【方式7】最后我们使用Linq语法来实现同样的效果
Console.WriteLine( " \r\n方式7 " );
var lsps7 
=  from p  in  lpsTmp  where  p.Age  >   25   &&  p.Age  <   30  select p;
foreach  (Person p  in  lsps7)
    Console.WriteLine(
string .Format( " {0}'s ID is {1},{2} years old " , p.Name, p.ID, p.Age));
// -------------------------------------------------------


// -------------------------------------------------------
// 通过这里列出的几种实现方式,我们会发现用来实现的代码越来越简洁,随之提升将不仅仅是编码效率哦.吼吼!!!
// 这里除了Linq,成员方法,静态方法和扩展方法都可以分别使用命名委托、匿名委托或Lambda表达式作为参数!!!
// 这里代码演变到简洁的过程如下:
// 命名委托==>匿名委托==>Lambda表达式
// 成员方法(list.FindAll)==>静态方法==>扩展方法==>Linq
// 综上所述,Linq的本质无外乎委托,整一个活生生的"语法糖",他把许多东西都交给编译器来处理了
// 由此可见,在学习的过程中举一反三还是比较重要的,知其然更要知其所以然,通过了解本质,对于我们来说将更容易掌握知识,应用知识!!!
// 所涉及之处,难免会存在一些问题,诚恳希望大伙们能够提出并一起讨论!!!
// 参考资料:《LINQ-the future of data access in c# 3.0》
// -------------------------------------------------------
完整下载:/Files/DongPad/LINQApp.7z

转载于:https://www.cnblogs.com/DongPad/archive/2009/09/24/1573628.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值