//
【一个比较简单的需求,找出年龄大于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》
// -------------------------------------------------------
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》
// -------------------------------------------------------