<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title>DongPad</title><link>http://www.dongpad.com</link> <description>Every day is a new beginning!</description><copyright>2.0 beta 03</copyright> <language>zh-cn</language><item><title>LINQ学习笔记及总结(1)</title><description><![CDATA[<p>完整下载：<a href="http://files.cnblogs.com/DongPad/LINQApp.7z">/Files/DongPad/LINQApp.7z</a></p>
<p>//【一个比较简单的需求,找出年龄大于25小于30的Person】   <br />List<Person> lpsTmp = new List<Person>{    <br />new Person{ID=1000,Name="A",Age=24},    <br />new Person{ID=1001,Name="B",Age=26},    <br />new Person{ID=1002,Name="C",Age=28},    <br />new Person{ID=1003,Name="D",Age=30},    <br />new Person{ID=1004,Name="E",Age=32}    <br />};    <br />//-------------------------------------------------------    <br />//【方式1】如果是在net1.1(1.1中还没有引入泛型概念)或2.0中,直接遍历    <br />Console.WriteLine("方式1");    <br />foreach (Person p in lpsTmp)    <br />{    <br />if (p.Age > 25 && p.Age < 30)    <br />&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Console.WriteLine(string.Format("{0}'s ID is {1},{2} years old", p.Name, p.ID, p.Age));    <br />&#160;&#160;&#160; }    <br />}    <br />//-------------------------------------------------------    <br />//-------------------------------------------------------    <br />//【方式2】使用List的FindAll来实现,这里主要用到了2.0里的Predicate泛型委托    <br />// Predicate可以省略    <br />Console.WriteLine("\r\n方式2");    <br />lpsTmp.FindAll(new Predicate<Person>(FindMatchPerson2));    <br />//或    <br />lpsTmp.FindAll(FindMatchPerson2);    <br />//-------------------------------------------------------    <br />//-------------------------------------------------------    <br />//【方式3】方式2中我们需要额外的定义一个方法用来匹配集合中的对象    <br />//我们可以使用更简洁的语法,那就是匿名方法, Predicate可以省略    <br />Console.WriteLine("\r\n方式3");    <br />lpsTmp.FindAll(new Predicate<Person>(delegate(Person p)    <br />{    <br />if (p.Age > 25 && p.Age < 30)    <br />&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Console.WriteLine(string.Format("{0}'s ID is {1},{2} years old", p.Name, p.ID, p.Age));    <br />return true;    <br />&#160;&#160;&#160; }    <br />return false;    <br />}));    <br />//或    <br />lpsTmp.FindAll(delegate(Person p) { return true; });    <br />//-------------------------------------------------------    <br />//-------------------------------------------------------    <br />//【方式4】方式3中我们通过匿名方法避免了去定义一个额外的判断方法    <br />//接下来我们来使用lambda表达式实现同样的效果    <br />//Lambda表达式实际上为书写匿名方法提供了一种更加简单、更加函数化的语法    <br />Console.WriteLine("\r\n方式4");    <br />var lsps4 = lpsTmp.FindAll(new Predicate<Person>(p => p.Age > 25 && p.Age < 30));    <br />//或    <br />lsps4 = lpsTmp.FindAll(p => p.Age > 25 && p.Age < 30);    <br />foreach (Person p in lsps4)    <br />&#160;&#160;&#160; Console.WriteLine(string.Format("{0}'s ID is {1},{2} years old", p.Name, p.ID, p.Age));    <br />//-------------------------------------------------------    <br />//-------------------------------------------------------    <br />//【方式5】接下来我们使用Linq的一些静态方法,实际上List的一些扩展方法,Func可以省略    <br />Console.WriteLine("\r\n方式5");    <br />var lsps5 = System.Linq.Enumerable.Where(lpsTmp, new Func<Person, bool>(FindMatchPerson2)).ToList();    <br />//或    <br />lsps5 = System.Linq.Enumerable.Where(lpsTmp, FindMatchPerson2).ToList();    <br />//上面的【方式5】与【方式2】比较类似,都是委托给FindMatchPerson2来执行    <br />//下同【方式3】,使用了匿名方法,可以省略Func    <br />lsps5 = System.Linq.Enumerable.Where(lpsTmp, new Func<Person, bool>(delegate(Person ppTmp)    <br />{    <br />if (ppTmp.Age > 25 && ppTmp.Age < 30)    <br />&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Console.WriteLine(string.Format("{0}'s ID is {1},{2} years old", ppTmp.Name, ppTmp.ID, ppTmp.Age));    <br />return true;    <br />&#160;&#160;&#160; }    <br />return false;    <br />})).ToList();    <br />//下同【方式4】,使用lambda表达式,可以省略Func    <br />lsps5 = System.Linq.Enumerable.Where(lpsTmp, new Func<Person, bool>(p => p.Age > 25 && p.Age < 30)).ToList();    <br />//-------------------------------------------------------    <br />//-------------------------------------------------------    <br />//【方式6】接下来我们使用List的一些扩展方法,这主要是为了接下来使用Linq做个铺垫    <br />//因为linq的本质就是使用扩展方法扩展了对集合类型的各种查询方法,Func可以省略    <br />Console.WriteLine("\r\n方式6");    <br />var lsps6 = lpsTmp.Where(new Func<Person, bool>(FindMatchPerson2)).ToList();    <br />//或    <br />lsps6 = lpsTmp.Where(FindMatchPerson2).ToList();    <br />//上面的【方式6】与【方式2】比较类似,都是委托给FindMatchPerson2来执行    <br />//下同【方式3】,使用了匿名方法,可以省略Func    <br />lsps6 = lpsTmp.Where(new Func<Person, bool>(delegate(Person ppTmp)    <br />{    <br />if (ppTmp.Age > 25 && ppTmp.Age < 30)    <br />&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Console.WriteLine(string.Format("{0}'s ID is {1},{2} years old", ppTmp.Name, ppTmp.ID, ppTmp.Age));    <br />return true;    <br />&#160;&#160;&#160; }    <br />return false;    <br />})).ToList();    <br />//下同【方式4】,使用lambda表达式,可以省略Func    <br />lsps6 = lpsTmp.Where(new Func<Person, bool>(p => p.Age > 25 && p.Age < 30)).ToList();    <br />//-------------------------------------------------------    <br />//-------------------------------------------------------    <br />//【方式7】最后我们使用Linq语法来实现同样的效果    <br />Console.WriteLine("\r\n方式7");    <br />var lsps7 = from p in lpsTmp where p.Age > 25 && p.Age < 30 select p;    <br />foreach (Person p in lsps7)    <br />&#160;&#160;&#160; Console.WriteLine(string.Format("{0}'s ID is {1},{2} years old", p.Name, p.ID, p.Age));    <br />//-------------------------------------------------------    <br />//-------------------------------------------------------    <br />//通过这里列出的几种实现方式,我们会发现用来实现的代码越来越简洁,随之提升将不仅仅是编码效率哦.吼吼!!!    <br />//这里除了Linq,成员方法,静态方法和扩展方法都可以分别使用命名委托、匿名委托或Lambda表达式作为参数!!!    <br />//这里代码演变到简洁的过程如下:    <br />//命名委托==>匿名委托==>Lambda表达式    <br />//成员方法(list.FindAll)==>静态方法==>扩展方法==>Linq    <br />//综上所述,Linq的本质无外乎委托,整一个活生生的"语法糖",他把许多东西都交给编译器来处理了    <br />//由此可见,在学习的过程中举一反三还是比较重要的,知其然更要知其所以然,通过了解本质,对于我们来说将更容易掌握知识,应用知识!!!    <br />//所涉及之处,难免会存在一些问题,诚恳希望大伙们能够提出并一起讨论!!!    <br />//参考资料：《LINQ-the future of data access in c# 3.0》    <br />//-------------------------------------------------------</p>]]></description><author>Jack</author><link>http://www.dongpad.com/CSharp-20090924-218.html</link><pubdate>2009-9-24 23:35:28</pubdate></item></channel></rss>
