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》
//-------------------------------------------------------
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》
//-------------------------------------------------------