C# 3.0通过Linq、Lambda、匿名函数、代理函数实现数据查询

      这几天,正在学习Linq、Lambda,做了些实验,通过Linq、Lambda、匿名函数、代理函数4种方式实现一个简单的查询,把实现结果记录一下,以免忘记。
      这段代码中有一个Person类,包含Name和Age两个属性。
      还有一个PersonHelper类(这个类规划不是很合理,只是做实验用下),包含一个强类型的List<Person>,并提供了4种实现数据查询的方法(都是查询年龄大于5的人员信息,并返回):
//方法1:通过Linq返回大于某个年龄段的人
public IEnumerable<Person> GetPersonByLinq(int age)

//方法2:通过Lambda表达式返回大于某个年龄段的人
public IEnumerable<Person> GetPersonByLambda(int age)

//方法3:通过匿名函数返回大于某个年龄段的人
public IEnumerable<Person> GetPersonByAnonymouseMethod(int age)

//方法4:通过代理函数返回大于某个年龄段的人(由于代理函数传递年龄参数不方便,代理函数是通过外部函数完成的)
public IEnumerable<Person> GetPersonBydelegate(Func<Person,bool> func)

下面是完整的代码(VSTS 2008,基于 .Net 3.0 的控制台工程)

  1using System;
  2using System.Collections.Generic;
  3using System.Linq;
  4using System.Text;
  5
  6namespace LinqTest
  7{
  8    class Program
  9    {
 10        static void Main(string[] args)
 11        {
 12
 13            PersonHelper helper = new PersonHelper();
 14
 15            //初始化Person类(0-6岁),并把结果放入list列表
 16            for (int i = 0; i < 7; i++)
 17            {
 18                Person p = new Person() 
 19                { Name = string.Format("Jiessieliang{0}", i.ToString()), Age = i };
 20
 21                helper.List.Add(p);
 22            }

 23
 24            //方法1:通过Linq返回岁数大于5的人员集合
 25            IEnumerable<Person> results = helper.GetPersonByLinq(5);
 26            Print(results);
 27
 28
 29            //方法2:通过Lambda表达式返回岁数大于5的人员集合
 30            IEnumerable<Person> results1 = helper.GetPersonByLambda(5);
 31            Print(results1);
 32
 33
 34
 35            //方法3:通过匿名方法返回岁数大于5的人员集合
 36            IEnumerable<Person> results2 = helper.GetPersonByAnonymouseMethod (5);
 37            Print(results2);
 38
 39
 40            //方法4:通过代理函数返回岁数大于5的人员集合
 41
 42            //定义一个代理【protected static bool getByAge(Person person)】
 43            Func<Person, bool> func = new Func<Person, bool>(getByAge);
 44
 45            //通过代理函数返回岁数大于5的人员集合
 46            IEnumerable<Person> results3 = helper.GetPersonBydelegate(func);
 47            Print(results3);
 48
 49
 50            Console.Read();
 51        }

 52
 53        /// <summary>
 54        /// 方法4中 最终被调用执行的代理函数
 55        /// </summary>
 56        /// <param name="person"></param>
 57        /// <returns></returns>

 58        protected static bool getByAge(Person person)
 59        {
 60            return person.Age > 5;
 61        }

 62
 63        /// <summary>
 64        /// 打印信息到屏幕
 65        /// </summary>
 66        /// <param name="results"></param>

 67        static void  Print(IEnumerable<Person> results)
 68        {
 69
 70            foreach (Person person in results)
 71            {
 72                Console.WriteLine(string.Format("Name is : {0} , Age is : {1}", person.Name, person.Age));
 73            }

 74        }
  
 75    }

 76
 77    /// <summary>
 78    /// Person类
 79    /// </summary>

 80    public class Person
 81    {
 82        public Person()
 83        { }
 84        private string _name;
 85
 86        public string Name
 87        {
 88            get return _name; }
 89            set { _name = value; }
 90        }

 91        private int _age;
 92
 93        public int Age
 94        {
 95            get return _age; }
 96            set { _age = value; }
 97        }

 98
 99    }

100
101    /// <summary>
102    /// PersonHelper类
103    /// </summary>

104    public class PersonHelper
105    {
106        /// <summary>
107        /// 存放Person的列表
108        /// </summary>

109        List<Person> _list;
110
111        public List<Person> List
112        {
113            get return _list; }
114          
115        }

116
117        public PersonHelper()
118        {
119            _list = new List<Person>();
120          
121        }

122
123        /// <summary>
124        /// 方法1:通过Linq返回结果
125        /// </summary>
126        /// <param name="age"></param>
127        /// <returns></returns>

128        public IEnumerable<Person> GetPersonByLinq(int age)
129        {
130            return from ps in List
131                   where ps.Age > age
132                   select ps;
133        }

134
135        /// <summary>
136        /// 方法2:通过Lambda返回结果
137        /// </summary>
138        /// <param name="age"></param>
139        /// <returns></returns>

140        public IEnumerable<Person> GetPersonByLambda(int age)
141        {
142            return Enumerable.Where<Person>(List, ps => (ps.Age > age));
143        }

144
145        /// <summary>
146        /// 方法3:通过匿名方法返回结果
147        /// </summary>
148        /// <param name="age"></param>
149        /// <returns></returns>

150        public IEnumerable<Person> GetPersonByAnonymouseMethod(int age)
151        {
152
153            return Enumerable.Where<Person>(List, 
154                delegate(Person ps) return ps.Age > age; });
155        }

156
157        /// <summary>
158        /// 方法4:通过代理函数返回结果
159        /// </summary>
160        /// <param name="func"></param>
161        /// <returns></returns>

162        public IEnumerable<Person> GetPersonBydelegate(Func<Person,bool> func)
163        {
164            return Enumerable.Where<Person>(List, func);
165        }

166    }

167}
最终输出结果为:
Name is : Jiessieliang6 , Age is : 6
Name is : Jiessieliang6 , Age is : 6
Name is : Jiessieliang6 , Age is : 6
Name is : Jiessieliang6 , Age is : 6

同一个查询,可以通过Linq,Lambda表达式,匿名方法和代理来实现。
posted @ 2009-09-08 00:06  零零猪  阅读(1890)  评论(0编辑  收藏  举报