C#编程(六十一)------------LINQ中的扩展方法
2017-03-27 09:22
387 查看
原文链接: 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操作中,可以将各个单独的操作连成一条管道,然后信息在这条管道中传输.这其实是扩展方法存在的原因之一,因为扩展方法允许将静态方法调用连接在一起.这样做的好处是能够以一种自然的方法将静态方法连接起来.
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操作中,可以将各个单独的操作连成一条管道,然后信息在这条管道中传输.这其实是扩展方法存在的原因之一,因为扩展方法允许将静态方法调用连接在一起.这样做的好处是能够以一种自然的方法将静态方法连接起来.
相关文章推荐
- Linq的那些事——从Linq扩展方法回顾C#语言基础
- 为LINQ服务的C#新特性总结篇---扩展方法,匿名委托,lambda表达式,Action委托,Func委托,Linq中的order by,top和sum函数
- 扩展方法(C# 编程指南)
- 扩展方法(C# 编程指南)
- 委托是什么?匿名方法是什么?在C# 3.0中,Lambda表达式是什么?扩展方法是什么?LINQ是什么?您觉得C# 3.0中还有哪些重要的特性,它们带来了什么优势?BCL中哪些类库和这些特性有关?您平时最常用哪些
- 扩展方法(C# 编程指南)
- [深入学习C#]LINQ查询表达式详解(1)——基本语法、使用扩展方法和Lambda表达式简化LINQ查询
- 扩展方法(C# 编程指南)
- C#可扩展编程之MEF学习笔记(三):导出类的方法和属性
- 如何:实现和调用自定义扩展方法(C# 编程指南)
- C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理
- 扩展方法(C# 编程指南)
- Linq的那些事——从Linq扩展方法回顾C#语言基础
- c#编程指南(五) 扩展方法(Extension Method)
- C#中的扩展方法,Linq,IO和多线程的定义和实例
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
- C#可扩展编程之MEF(三):导出类的方法和属性
- 扩展方法(C# 编程指南)
- C# 的扩展方法在 LINQ 中实现数组排序
- 扩展方法(C# 编程指南)