LINQ中的扩展方法

LINQ中的where(),OderByDescending().Select()并不是IEnumerable<T>的方法,却能使用这些方法,查阅了资料发现是用到了C#的扩展方法。

举个小例子:

定义一个静态类StringExtension和静态方法Foo,关键字this.

 public static class StringExtension
    {
        public static void Foo(this string s)
        {
            Console.WriteLine("Foo invoked fro {0}", s);
        }
    }

这样引用该类的命名空间之后,就可以调用Foo方法

string s = "hello";
s.Foo();

等同于

string s = "hello";
StringExtension.Foo(s); //s.Foo();

LINQ的扩展方法的类是System.Linq命名空间下的Enumerable。

调用Where方法时,第一个参数是包含了this的IEnumerable<T>,第二个参数是一个Func<T,bool>委托,它引用一个返回Bool、参数为T的方法。

时间: 2024-08-25 01:58:10

LINQ中的扩展方法的相关文章

使用Linq中的Distinct方法对序列进行去重操作

使用Linq提供的扩展方法Distinct可以去除序列中的重复元素. 该方法具有以下两种重载形式: (1)public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source) (重载1) 通过使用默认的相等比较器对值进行比较并返回序列中的非重复元素. (2)publicstatic IQueryable<TSource> Distinct<TSour

IQueryable 查询语句中 OrderByDescending() 扩展方法使用注意点

目的: 查询结构物下所有网关的最新诊断结果. 1. 正确查询 (按诊断时间倒序) var query = queryDiag.GroupBy(g => new {g.dtuId, g.dtuNo, g.dtuDesp}) .Select(s => s.GroupBy(r => r.diagTime) .Select(e => new { s.Key.dtuId, s.Key.dtuNo, s.Key.dtuDesp, diagTime = e.Key, cpuRatio = e.W

C#中的扩展方法及用途

GPS平台.网站建设.软件开发.系统运维,找森大网络科技!http://cnsendnet.taobao.com来自森大科技官方博客http://www.cnsendblog.com/index.php/?p=476 扩展方法使你能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 以上是msdn官网对扩展方法的描述,现在我通过一个情景例子来对此进行阐释.假设一个控制台程序cla

C#中的扩展方法

在java中没有这样的东西,一个类一旦是 final的 ,这个类就不能再被添加方法, 但是C#能够做到,可以给 sealed 类添加新的方法,这点我还是比较喜欢c#的. 这就是C#中的扩展方法. 那么什么情况下我们才需要去给一个类写扩展方法呢? 系统自带的类型,我们无法去修改: 修改源代码需要较大的精力,而且可能会带来错误: 我们只是需要一个或者较少的几个方法,修改源代码费时费力: 被扩展的类是sealed的,不能被继承:(就算不是sealed的,我们也不能因为需要一个方法而去写一个子类,这样不

记录C#中的扩展方法

C#中的扩展方法. 系统自带的类型,我们无法去修改: 修改源代码需要较大的精力,而且可能会带来错误: 我们只是需要一个或者较少的几个方法,修改源代码费时费力: 被扩展的类是sealed的,不能被继承:(就算不是sealed的,我们也不能因为需要一个方法而去写一个子类,这样不是面向对象) 扩展方法的三个要素: 扩展方法必须处于一个静态类中: 扩展方法必须是一个静态方法: 扩展方法的参数列表必须以 this 开头,this 后面紧跟的是被扩展类,然后才是方法需要的参数:

C#中的扩展方法学习总结

??版权声明:本文由秦元培创作和发表,采用署名(BY)-非商业性使用(NC)-相同方式共享(SA)国际许可协议进行许可,转载请注明作者及出处,本文作者为秦元培,本文标题为C#中的扩展方法学习总结,本文链接为http://qinyuanpei.com/2015/12/05/extend-methods-of-csharp/. ??各位朋友大家好,我是秦元培,欢迎大家关注我的博客.最近偶然接触到了C#中的扩展方法,觉得这个语法特性是一个不错的特性,因此决定在这里系统地对C#中的扩展方法相关内容进行下

在C#中使用扩展方法

在我们的编程过程中,会使用各种类库,有自己写的,有的用别人的.当我们使用第三方的类库时,有时候为了使用方便,希望给类库增加一些Helper方法,这时候就要使用扩展方法了. 看看MSDN上的介绍:扩展方法使你能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 通常,建议你只在不得已的情况下才实现扩展方法,并谨慎地实现. 只要有可能,必须扩展现有类型的客户端代码都应该通过创建从现有

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

在c#中要扩展一个现有类很容易,比如这样: ? 1 2 3 4 5 6 7 public static class Utils {     public static void PrintToConsole(this string strSrc)     {         Console.WriteLine(strSrc);     }   } 这样就为String类添加了一个PrintToConsole的方法,使用方法如下: ? 1 2 3 4 5 6 7 class MainClass {

C#中自定义扩展方法

在C#中,我们在不写子类的情况下,可以为类增加扩展方法,前提的被扩展的类不能使静态类. 步骤如下:   定义一个静态 类以包含扩展方法.该类必须对客户端代码可见. 有关可访问性规则的更多信息,请参见 访问修饰符(C# 编程指南). 将该扩展方法实现为静态方法,并使其至少具有与包含类相同的可见性. 该方法的第一个参数指定方法所操作的类型:该参数必须以 this 修饰符开头. 在调用代码中,添加一条 using 指令以指定包含扩展方法类的 命名空间. 按照与调用类型上的实例方法一样的方式调用扩展方法