






















这几天,正在学习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 的控制台工程)
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
6
namespace 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表达式,匿名方法和代理来实现。
================================================================
转载要求及授权协议:
作者: 零零猪(or)Jiessie327(or)JiessieLiang
出处:http://jiessie327.cnblogs.com/
版权:本文版权归作者所有
转载:欢迎转载,为了尊重作者的劳动成果,在【转载】时请按作者要求,指明文章【出处】或给出【原文链接】,谢谢
================================================================
请遵守署名-非商业性使用-禁止演绎 2.5 中国大陆 License.
================================================================
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。