我已经使用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
方法。怎么可能?
答案 0 :(得分:5)
那是因为Single
是extension method。
扩展方法是静态类中的静态方法,它们的第一个输入参数用this
关键字标记。例如:
namespace System.Linq
{
public static class Enumerable
{
public static IEnumerable<T> Single<T>(this IEnumerable<T> source)
{
...
}
}
}
当编译器看到a.Single()
其中a
为IEnumerable<T>
并且无法在该对象上找到此类方法时,它会搜索一个带IEnumerable<T>
的扩展方法在它的第一个参数。
为了使此解决方案起作用,公开扩展方法Enumerable
的静态类需要在范围中,通过导入System.Linq
来引入范围命名空间。
答案 1 :(得分:3)
扩展方法使您可以向现有类型“添加”方法 无需创建新的派生类型,重新编译或其他方式 修改原始类型。扩展方法是一种特殊的方法 静态方法,但它们被称为就像它们是实例方法一样 扩展类型。
最常见的扩展方法是LINQ标准查询 将查询功能添加到现有的运算符 System.Collections.IEnumerable和 System.Collections.Generic.IEnumerable类型。使用标准 查询运算符,首先使用System.Linq将它们带入范围 指示。然后出现任何实现IEnumerable的类型 有实例方法,如GroupBy,OrderBy,Average等。 您可以在IntelliSense语句中查看这些其他方法 在IEnumerable的实例后键入“dot”时完成 类型如List或Array。