原文链接: 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中的扩展方法的更多相关文章

  1. C#中的扩展方法(向已有类添加方法,但无需创建新的派生类型)

    C#中的扩展方法 扩展方法使你能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样 ...

  2. C#3.0中的扩展方法

    在实际应用中,开发者完成代码的编译后,除非重新编译更改后的代码,否则开发者很难在原有代码中添加新的功能. 在C#3.0中,提供了一个扩展方法的新特性,可以使得开发者在编译后的程序集里边添加相关的方法, ...

  3. 记录C#中的扩展方法

    C#中的扩展方法. 系统自带的类型,我们无法去修改: 修改源代码需要较大的精力,而且可能会带来错误: 我们只是需要一个或者较少的几个方法,修改源代码费时费力: 被扩展的类是sealed的,不能被继承: ...

  4. objective-C中的扩展方法与partial class

     在c#中要扩展一个现有类非常easy,比方这样: ? 1 2 3 4 5 6 7 public static class Utils {     public static void PrintTo ...

  5. C#中的扩展方法

    扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 以上是msdn官网对扩展方 ...

  6. Linq中常用的方法

    这几天闲着也是闲着,就仔细的研究了一下Linq的语法,还有他的一些扩展方法的使用. 下面是一些常用的扩展方法. Aggregate 自定义的聚合计算 All 检测序列中所有元素是否都满足指定的条件 A ...

  7. MVC 中使用扩展方法

     扩展方法(Extension Method)是给那些不是你拥有.因而不能直接修改的类添加方法的一种方便的办法. 一.使用扩展方法 1.定义一个购物车的类-ShoppingCart using Sys ...

  8. .NET: 谈谈C#中的扩展方法

    扩展方法(Extension Methods)是C#3.0时引入的新特性,相信很多人都听过并且也都用过,最常见的是在LINQ中的使用. 不仅如此,在开发中,我们也可以创建自己扩展方法,使用它来优化类的 ...

  9. Linq快速入门——扩展方法

    Linq为我们提供了许多扩展方法,方便我们对数据源进行操作(Where,Select...).即使你不了解算法,也能使用Linq当回牛人.扩展方法本质并不是什么高深的技术,说白了就是一个Static静 ...

随机推荐

  1. 001_软件waf

    一.优秀的软件waf开源软件 <1>openwaf介绍  http://www.oschina.net/p/openwaf http://git.oschina.net/miracleqi ...

  2. IPsec学习笔记

    IPsec是什么 IPsec(IP Security)是一系列为IP通信提供安全性的协议和服务的集合,工作在IP层,可以为上层协议和应用提供透明的安全服务.IPsec提供两种安全机制:认证和加密. 认 ...

  3. 浅谈js设计模式 — 享元模式

    享元(flyweight)模式是一种用于性能优化的模式,“fly”在这里是苍蝇的意思,意为蝇量级.享元模式的核心是运用共享技术来有效支持大量细粒度的对象. 假设有个内衣工厂,目前的产品有 50种男式内 ...

  4. Batch Normalization 与 Caffe中的 相关layer

    在机器学习领域,通常假设训练数据与测试数据是同分布的,BatchNorm的作用就是深度神经网络训练过程中, 使得每层神经网络的输入保持同分布. 原因:随着深度神经网络层数的增加,训练越来越困难,收敛越 ...

  5. 【转】使用TCP协议连续传输大量数据时,是否会丢包,应如何避免?

    使用TCP协议连续传输大量数据时,是否会丢包,应如何避免? 比如发送文件.记得有人提过可能会发生什么堆栈溢出.怎样避免呢?是不是可以收到数据后发送确认包,收到确认包后再继续发送.或是发送方发送了一些数 ...

  6. 浅谈JavaScript DDOS 攻击原理与防御

    前言 DDoS(又名"分布式拒绝服务")攻击历史由来已久,但却被黑客广泛应用.我们可以这样定义典型的DDoS攻击:攻击者指使大量主机向服务器发送数据,直到超出处理能力进而无暇处理正 ...

  7. Linux系统运维笔记(四),CentOS 6.4安装 MongoDB

    Linux系统运维笔记(四),CentOS 6.4安装 MongoDB 1,下载 https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6 ...

  8. CDM中添加Hive服务时Gateway是什么?

    参考这里http://grokbase.com/t/cloudera/scm-users/12aayq5cyh/what-is-gateway-in-cloudera-manager 实际上Gatew ...

  9. Java之路(三) 控制执行流程

    Java的控制语句设计的关键字有if-else while do-while for return break和switch. Java虽然保留goto关键字,但不支持goto语句. 1.true和f ...

  10. 统计Mongo数组中相同对象的属性之和

    统计Mongo数组中相同对象的属性之和 需求 需要统计app端用户的行为,按天分表,存入mongo.每次用户进行操作的时候,将数据存入app本地,下次用户启动的时候,提交存入mongo,删除app本地 ...