C#编程(六十一)------------LINQ中的扩展方法
原文链接: http://blog.csdn.net/shanyongxu/article/details/47208401
LINQ中的扩展方法
LINQ中where扩展方法,要想使用,必须导入using System.Linq;我们看一下这个方法的声明:
public static IEnumerable<TSource > Where<TSource>(this IEnumerable<TSource> source,Func<TSource,bool> predicate)
分析:返回类型是IEnumerable<TSource>
第一个参数:this IEnumerable<TSource> source代表的是他要扩展的类型,也就是说在IEnumerable<TSource>可以直接调用where方法.
第二个参数Func<TSource,bool> predicate是一个委托,下面看一下他的声明:
public delegate TResult Func<T,TResult>(T arg)封装一个带有T类型,返回TResult类型的方法.
下面我们使用LINQ中的where方法来检索我们的列表.
案例如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
namespace ConsoleApplication19
{
class Program
{
static void Main(string[] args)
{
List<Person> lists = new List<Person>();
lists.Add(new Person("zhangsan", 22));
lists.Add(new Person("lisi", 22));
lists.Add(new Person("wangwu", 20));
lists.Add(new Person("zhaoliu", 33));
lists.Add(new Person("zhouqi", 29));
IEnumerable<Person> reList = lists.Where<Person>
(param => param.Age >= 25 && param.Age <= 30);
foreach (var item in reList)
{
Console.WriteLine(item.Name+"====="+item.Age);
}
//其实LINQ一般的查询,是可以直接写where select等语句来实现,系统编译时,会自动的将它
//转换成扩张方法的调用.
var query =from r in lists where r.Age>=20&&r.Age<=30 select r ;
Console.WriteLine("使用LINQ的where方法:");
var result = query.OrderBy(x => x.Age);//使用OrderBy进行排序
foreach (var item in result)
{
Console.WriteLine(item.Name+"====="+item.Age);
}
//LINQ语句必须是以from开头,以select或者group结尾
//注意:query变量,只是指定了一个查询方式,并没有执行
//真正执行的其实是在foreach时才产生的
//推迟查询的执行
//推迟查询的执行也就是说查询实在迭代时才执行的,不是 var query中,案例:
Console.WriteLine("增加新内容后的输出: ");
//新增加一个人,姓名是haha,年龄是22,28岁,这个新增加的人是符合年龄判断条件的
lists.Add(new Person("haha",28));
foreach (Person per in query)
{
Console.WriteLine(per.Name + " " + per.Age);
}
//可以看出,第二次迭代完全可以接触到对象,而我们并没有定义新的query,这就是推迟执行
Console.ReadKey();
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
}
}
其实第一个扩展方法已经完成,就是使用where方法来筛选数据.
说明:在VS中,我们能看到where的定义,从函数签名可以看出:扩张方法where从IEnumerable<TSource>类型的source中筛选出满足条件的predicate的结果,返回值仍为IEnumerable<TSource>类型
案例:用select进行投影操作.
上例也已经体现,这里不在多说了.
要不最后在说一下,免得你觉得我忽悠你:
where的用法:var query = lists.Where(it=>it.Age>=25)
select的用法:var query = from r in lists where r.Age >= 25 && r.Age < 30 select r;
说明:使用select方法后,产生了新的结果序列,该结果包含name以及age字段.where方法以及select方法的区别还是很明显的,where方法根据条件堆积和进行筛选操作,而select方法对集合进行投影操作得到新的结果序列.
查看扩展方法Select的定义,得到其函数签名如下:
public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector);
从函数签名中可以进一步了解到Select子句的作用:该扩展方法从集合source中按照selector指定的规则进行投影操作得到新的集合。
案例:用OrderBy进行排序,上例也有,仔细看
说明:
在本例中,使用OrderBy方法进行排序,该方法的函数签名如下:
public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector);
通过前面例子的解析,相信这个函数前面大家可以看懂了吧。这里就不赘述了。
总结:
通过前面的三个方法的例子学习,可以发现,在LINQ操作中,可以将各个单独的操作连成一条管道,然后信息在这条管道中传输.这其实是扩展方法存在的原因之一,因为扩展方法允许将静态方法调用连接在一起.这样做的好处是能够以一种自然的方法将静态方法连接起来.
C#编程(六十一)------------LINQ中的扩展方法的更多相关文章
- C#中的扩展方法(向已有类添加方法,但无需创建新的派生类型)
C#中的扩展方法 扩展方法使你能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样 ...
- C#3.0中的扩展方法
在实际应用中,开发者完成代码的编译后,除非重新编译更改后的代码,否则开发者很难在原有代码中添加新的功能. 在C#3.0中,提供了一个扩展方法的新特性,可以使得开发者在编译后的程序集里边添加相关的方法, ...
- 记录C#中的扩展方法
C#中的扩展方法. 系统自带的类型,我们无法去修改: 修改源代码需要较大的精力,而且可能会带来错误: 我们只是需要一个或者较少的几个方法,修改源代码费时费力: 被扩展的类是sealed的,不能被继承: ...
- objective-C中的扩展方法与partial class
在c#中要扩展一个现有类非常easy,比方这样: ? 1 2 3 4 5 6 7 public static class Utils { public static void PrintTo ...
- C#中的扩展方法
扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 以上是msdn官网对扩展方 ...
- Linq中常用的方法
这几天闲着也是闲着,就仔细的研究了一下Linq的语法,还有他的一些扩展方法的使用. 下面是一些常用的扩展方法. Aggregate 自定义的聚合计算 All 检测序列中所有元素是否都满足指定的条件 A ...
- MVC 中使用扩展方法
扩展方法(Extension Method)是给那些不是你拥有.因而不能直接修改的类添加方法的一种方便的办法. 一.使用扩展方法 1.定义一个购物车的类-ShoppingCart using Sys ...
- .NET: 谈谈C#中的扩展方法
扩展方法(Extension Methods)是C#3.0时引入的新特性,相信很多人都听过并且也都用过,最常见的是在LINQ中的使用. 不仅如此,在开发中,我们也可以创建自己扩展方法,使用它来优化类的 ...
- Linq快速入门——扩展方法
Linq为我们提供了许多扩展方法,方便我们对数据源进行操作(Where,Select...).即使你不了解算法,也能使用Linq当回牛人.扩展方法本质并不是什么高深的技术,说白了就是一个Static静 ...
随机推荐
- react-native 报错
报错信息: java.lang.RuntimeException: Unable to load script from assets 'index.android.bundle'. Make sur ...
- py-faster-rcnn在windows下安装
准备好vs2013+anaconda2+好点的显卡(比如GTX970) 先改造caffe-rfcn以支持cudnn5,得到caffe-rfcn-cudnn5:替换个别代码文件和代码:改.props 再 ...
- 第一届CCF软件能力认证
1.相反数 问题描述 有 N 个非零且各不相同的整数.请你编一个程序求出它们中有多少对相反数(a 和 -a 为一对相反数). 输入格式 第一行包含一个正整数 N.(1 ≤ N ≤ 500). 第二行为 ...
- 【struts2基础】配置详解
一.struts2工作原理(网友总结,千遍一律) 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做Action ...
- JMS(Java消息服务)
JMS即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM:指的是利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来 ...
- 关于Sql Server的一些知识点的定义总结
数据库完整性:是指数据库中数据在逻辑上的一致性.正确性.有效性和相容性 实体完整性(Entity Integrity 行完整性):实体完整性指表中行的完整性.主要用于保证操作的数据(记录)非空.唯一 ...
- django URLconf调度程序
路由的编写方式是Django2.0和1.11最大的区别所在,Django官方迫于压力和同行的影响,不得不将原来的正则匹配表达式,改为更加简单的path表达式,但依然通过re_path()方法保持对1. ...
- 浅谈2-SAT(待续)
2-SAT问题,其实是一个逻辑互斥问题.做了两道裸题之后仔细想来,和小时候做过的“有两个女生,如果A是女生,那么B一定不是女生.A和C性别相同,求A.B.C三人的性别.”几乎是一样的. 对于这道题我们 ...
- 在VC++中怎样改变控件间的TAB切换顺序?
在编辑界面按下ctrl+D键,就会出现所有控件的Tab键顺序,按照自己想要的顺序依次点击控件,就可以重新安排顺序.
- bzoj4456: [Zjoi2016]旅行者
题目链接 bzoj4456: [Zjoi2016]旅行者 题解 网格图,对于图分治,每次从中间切垂直于长的那一边, 对于切边上的点做最短路,合并在图两边的答案. 有点卡常 代码 #include< ...