• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#编程(六十一)------------LINQ中的扩展方法

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

原文链接: 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操作中,可以将各个单独的操作连成一条管道,然后信息在这条管道中传输.这其实是扩展方法存在的原因之一,因为扩展方法允许将静态方法调用连接在一起.这样做的好处是能够以一种自然的方法将静态方法连接起来.

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
归纳一下:C#线程同步的几种方法发布时间:2022-07-14
下一篇:
c#和Javascript中去重总结发布时间:2022-07-14
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap