C# 3.0通过Linq、Lambda、匿名函数、代理函数实现数据查询
这几天,正在学习Linq、Lambda,做了些实验,通过Linq、Lambda、匿名函数、代理函数4种方式实现一个简单的查询,把实现结果记录一下,以免忘记。
这段代码中有一个Person类,包含Name和Age两个属性。
还有一个PersonHelper类(这个类规划不是很合理,只是做实验用下),包含一个强类型的List<Person>,并提供了4种实现数据查询的方法(都是查询年龄大于5的人员信息,并返回):
下面是完整的代码(VSTS 2008,基于 .Net 3.0 的控制台工程)
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表达式,匿名方法和代理来实现。
这段代码中有一个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)
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
}
最终输出结果为:
using System;2
using System.Collections.Generic;3
using System.Linq;4
using System.Text;5

6
namespace LinqTest7
{8
class Program9
{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 Person81
{82
public Person()83
{ }84
private string _name;85

86
public string Name87
{88
get { return _name; }89
set { _name = value; }90
}91
private int _age;92

93
public int Age94
{95
get { return _age; }96
set { _age = value; }97
}98

99
}100

101
/// <summary>102
/// PersonHelper类103
/// </summary>104
public class PersonHelper105
{106
/// <summary>107
/// 存放Person的列表108
/// </summary>109
List<Person> _list;110

111
public List<Person> List112
{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 List131
where ps.Age > age132
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.
================================================================
转载要求及授权协议:
作者: 零零猪(or)Jiessie327(or)JiessieLiang
出处:http://jiessie327.cnblogs.com/
版权:本文版权归作者所有
转载:欢迎转载,为了尊重作者的劳动成果,在【转载】时请按作者要求,指明文章【出处】或给出【原文链接】,谢谢
================================================================
请遵守署名-非商业性使用-禁止演绎 2.5 中国大陆 License.
================================================================

