为什么`使用System.Linq`为其他库添加了功能

时间:2013-11-23 06:42:52

标签: c# linq

我已经使用C#已经有好几年了,但是我已经有点懒得去了解它的所有新功能。也许其中一个主要特征是Linq,我从未理解它的好处。但是没关系,我现在感兴趣的是将using System.Linq语句添加到文件时发生的黑魔法。

最近我一直在MongoDB中使用C#,我想从数据库中检索单个文档。以下是它的完成方式:

var cursor = colletion.FindAs<Entity>(query).SetLimit(1);
var en = cursor.Single<Entity>();

上面的代码从集合中提取了一个Entity类型的单个文档。让我感到惊讶的部分是,只有在Single添加到文件中时才会识别游标的using System.Linq方法。怎么可能?

2 个答案:

答案 0 :(得分:5)

那是因为Singleextension method

扩展方法是静态类中的静态方法,它们的第一个输入参数用this关键字标记。例如:

namespace System.Linq 
{
    public static class Enumerable
    {
        public static IEnumerable<T> Single<T>(this IEnumerable<T> source)
        {
            ...
        }
    }
}

当编译器看到a.Single()其中aIEnumerable<T>并且无法在该对象上找到此类方法时,它会搜索一个带IEnumerable<T>的扩展方法在它的第一个参数。

为了使此解决方案起作用,公开扩展方法Enumerable的静态类需要在范围中,通过导入System.Linq来引入范围命名空间。

答案 1 :(得分:3)

来自msdn extension methods

  

扩展方法使您可以向现有类型“添加”方法   无需创建新的派生类型,重新编译或其他方式   修改原始类型。扩展方法是一种特殊的方法   静态方法,但它们被称为就像它们是实例方法一样   扩展类型。

     

最常见的扩展方法是LINQ标准查询   将查询功能添加到现有的运算符   System.Collections.IEnumerable和   System.Collections.Generic.IEnumerable类型。使用标准   查询运算符,首先使用System.Linq将它们带入范围   指示。然后出现任何实现IEnumerable的类型   有实例方法,如GroupBy,OrderBy,Average等。   您可以在IntelliSense语句中查看这些其他方法   在IEnumerable的实例后键入“dot”时完成   类型如List或Array。