环境:.net framework 3.0以上 作者:lihui_830501
学习使用扩展方法之前,先学习一下Lambda表达式.Lambda表达式写成一个后面紧跟 => 标记的参数列表,=>之后是一个表达式或表语句块。Lambda表达式的参数可以是显型和隐型的。在显型参数列表中,每个参数的类型是显式指定的。在隐型参数列表中,参数的类型由lambda表达式出现的语境推导--特定地,当lambda表达式被转型到一个兼容的delegate类型时,delegate类型提供参数的类型.在有单一的隐型参数的lambda表达式中,圆括号可以从参数列表中省略。
以下是几种语法实现:
//
单一参数
x
=>
x
+
1
;
x
=>
{ return x + 1; }
;
(
int
x)
=>
x
+
1
;
(
int
x)
=>
{ return x + 1; }
;
//
多参数:
(x, y)
=>
x
*
y;
//
无参数:
()
=>
Console.WriteLine();
单一参数例子:
定义委托
delegate
R Func
<
A, R
>
(A arg);
在程序里使用
Func
<
int
,
int
>
f1
=
x
=>
x
+
1
;
int
i
=
f1(
4
);
i的值为5.
二参数例子:
定义委托
delegate
R Func
<
A, R
>
(A arg, A arg2);
在程序里使用
Func
<
int
,
int
>
f1
=
(x, y)
=>
{
if (x > 3)
{
return x + y;
}
else
{
return y;
}
}
;
int
i
=
f1(
4
,
4
);
i的值为8.
下面再简单介绍一下扩展方法.扩展方法是可以通过使用实例方法语法调用的静态方法。效果上,扩展方法使得用附加的方法扩展已存在类型和构造类型成为可能。扩展方法是通过指定关键字this修饰方法的第一个参数而声明的。扩展方法仅可声明在静态类中.
例如:
public
static
class
Extensions
{
public static int ToInt32(this string s)
{
return Int32.Parse(s);
}
}
这样就在string类型上扩展了一个新的方法ToInt32.
string
s
=
"
1234
"
;
int
i
=
s.ToInt32();
在string变量s上直接就可以使用这个扩展方法了.更加详尽的资料请查阅相关文档.
实现IEnumerable的类型会有一些扩展方法如All<>.传递的参数就是Lambda表达式(x => x + 1).今天主要就是写一些自己学习这些方法的笔记.以最简单的数组为例:int[] array = new int[5]{1,2,3,4,5};
以下方法介绍全由array做例子,因为是int型数组,因此下面例子中的一些类型会也是INT型.
1.All<>方法:
All的意思大家都知道,就是全部的意思,这里就是迭代所有元素进行判断,返回布尔值.判断方法就是一个Lambda表达式.
如:
bool
b
=
array.All(i
=>
i
>
1
);
表达式需要返回bool值.
如果每个数组元素都大于1返回true否则false;
2.Any<>方法:
有二个重载,没有参数时,如果数组有元素就返回true否则false.有参数时,迭代所有元素进行判断,只要有元素符合判断就返回true否则false;
如:
bool
b
=
array.Any();
//
因为有5个元素因此返回true.
bool
b
=
array.Any(i
=>
i
==
0
);
//
只要数组的其中一个元素等于0就返回true.这里没有等于0的元素,因此返回false.
//
表达式需要返回bool值.
3.Contains方法:检查某个元素是否在集合中.
4.AsEnumerable<>方法:返回一个IEnumerable<T>.
5.AsQueryable<>方法:返回一个IQueryable<T>.
6.AsReadOnly方法:返回一个只读IList<T>.
7.Where<>方法:
过滤集合的条件
如:
IEnumerable
<
int
>
array2
=
array.Where(i
=>
i
>
3
);
//
返回元素大于3的新集合.结果int[2]{4,5}
表达式需要返回bool值.
8.Select<>,SelectMany<>方法:
跟据表达式选择结果,返回该结果的集合.
如:
IEnumerable
<
int
>
a3
=
array.Select(i
=>
i
+
1
);
//
返回所有元素加1后产生的新集合.结果int[5]{2,3,4,5,6}
//
表达式需要返回int值.
IEnumerable
<
int
>
a4
=
array.SelectMany(i
=>
new
int
[
2
]
{ 1, i }
);
//
返回每个表达式返回值组合起来的新集合.结果int[10]{1,1,1,2,1,3,1,4,1,5}
//
表达式需要返回IEnumerable<int>值.
9.OrderBy<>,OrderByDescending<>,ThenBy<>,ThenByDescending<>,Reverse<>方法:
OrderBy按升序排序,OrderByDescending按降序排序,ThenBy和ThenByDescending进行第二次排序,Reverse反转集合中元素的顺序
如:
IEnumerable
<
int
>
a5
=
array.OrderBy(i
=>
i);
//
返回升序后的集合
表达式需要返回关键字.在这里是int型的元素.
其它排序方法同上.
10.Join<>方法:
连接二个集合,类似SQL中的Join
如:
int
[] array2
=
new
int
[
2
]
{ 1, 2 }
;
IEnumerable
<
int
[]
>
a6
=
array.Join(array2, i
=>
i, n
=>
n, (x, y)
=>
new
int
[
2
]
{ x, y }
);
i是array的key,n是array2的key,最后返回二个数组相同的值的数组集合。返回集合的元素类弄要跟表达式的返回值类型一致.
另外一种写法:
IEnumerable
<
int
[]
>
a7
=
from i1
in
array
join i2
in
array2
on i1 equals i2
select
new
int
[
2
]
{i1,i2}
;
l
未完待续。 lihui_830501饿了,吃饭去了。
学习使用扩展方法之前,先学习一下Lambda表达式.Lambda表达式写成一个后面紧跟 => 标记的参数列表,=>之后是一个表达式或表语句块。Lambda表达式的参数可以是显型和隐型的。在显型参数列表中,每个参数的类型是显式指定的。在隐型参数列表中,参数的类型由lambda表达式出现的语境推导--特定地,当lambda表达式被转型到一个兼容的delegate类型时,delegate类型提供参数的类型.在有单一的隐型参数的lambda表达式中,圆括号可以从参数列表中省略。
以下是几种语法实现:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
单一参数例子:
定义委托
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
在程序里使用
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
二参数例子:
定义委托
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
在程序里使用
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
i的值为8.
下面再简单介绍一下扩展方法.扩展方法是可以通过使用实例方法语法调用的静态方法。效果上,扩展方法使得用附加的方法扩展已存在类型和构造类型成为可能。扩展方法是通过指定关键字this修饰方法的第一个参数而声明的。扩展方法仅可声明在静态类中.
例如:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
这样就在string类型上扩展了一个新的方法ToInt32.
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
在string变量s上直接就可以使用这个扩展方法了.更加详尽的资料请查阅相关文档.
实现IEnumerable的类型会有一些扩展方法如All<>.传递的参数就是Lambda表达式(x => x + 1).今天主要就是写一些自己学习这些方法的笔记.以最简单的数组为例:int[] array = new int[5]{1,2,3,4,5};
以下方法介绍全由array做例子,因为是int型数组,因此下面例子中的一些类型会也是INT型.
1.All<>方法:
All的意思大家都知道,就是全部的意思,这里就是迭代所有元素进行判断,返回布尔值.判断方法就是一个Lambda表达式.
如:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
表达式需要返回bool值.
如果每个数组元素都大于1返回true否则false;
2.Any<>方法:
有二个重载,没有参数时,如果数组有元素就返回true否则false.有参数时,迭代所有元素进行判断,只要有元素符合判断就返回true否则false;
如:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
3.Contains方法:检查某个元素是否在集合中.
4.AsEnumerable<>方法:返回一个IEnumerable<T>.
5.AsQueryable<>方法:返回一个IQueryable<T>.
6.AsReadOnly方法:返回一个只读IList<T>.
7.Where<>方法:
过滤集合的条件
如:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
表达式需要返回bool值.
8.Select<>,SelectMany<>方法:
跟据表达式选择结果,返回该结果的集合.
如:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
9.OrderBy<>,OrderByDescending<>,ThenBy<>,ThenByDescending<>,Reverse<>方法:
OrderBy按升序排序,OrderByDescending按降序排序,ThenBy和ThenByDescending进行第二次排序,Reverse反转集合中元素的顺序
如:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
表达式需要返回关键字.在这里是int型的元素.
其它排序方法同上.
10.Join<>方法:
连接二个集合,类似SQL中的Join
如:
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
i是array的key,n是array2的key,最后返回二个数组相同的值的数组集合。返回集合的元素类弄要跟表达式的返回值类型一致.
另外一种写法:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
未完待续。 lihui_830501饿了,吃饭去了。