这是关于c#的 SYNTAX 和 NOT 关于我们如何调用/使用IQueryable的问题
有人可以向我解释一下:
我们有这个声明(System.Linq):
public static double Average<TSource>(this IQueryable<TSource> source,
Expression<Func<TSource, int>> selector)
并调用平均值
double average = fruits.AsQueryable().Average(s => s.Length);
我理解如何调用Average和IQueryable的所有类似的静态方法 但我不明白声明的语法。
public static double Average<TSource>(this IQueryable<TSource> source,
Expression<Func<TSource, int>> selector)
<TSource>
在 Average<TSource>(
中的含义是什么
以及 this IQueryable<TSource> source
。
因为我们调用它时只有一个参数和实际的lambda表达式(s => s.Length);
提前致谢。
答案 0 :(得分:6)
<TSource>
部分声明方法的泛型类型参数 - 基本上是序列包含的元素类型。在进入LINQ之前,你一定要理解泛型。
然后,
this IQueryable<TSource> source
表示方法的第一个参数:
this
表示它是extension method IQueryable<TSource>
表示参数的类型source
是参数的名称它是一种扩展方法的事实可能让你感到困惑。当你打电话
query.Average(s => s.Length)
由编译器转换为
Queryable.Average(query, s => s.Length)
答案 1 :(得分:1)
您正在声明一种扩展方法(即this
关键字),它将您的方法添加到实现IQueryable<TSource>
的任何类型,其中TSource
是通用类型,并且在整个过程中保持不变表达
在这种情况下,编译器可以推断泛型类型,因此在调用方法时不需要声明它
答案 2 :(得分:0)
TSource是您将声明的泛型类型。它基本上是s的类型。
答案 3 :(得分:0)
Average<TSource>
因为这是Generic Method。该方法可以在任何类型上的查询或枚举上运行(只要提供了适合该类型的选择器)。
this IQueryable<TSource> source
因为这是Extension Method。扩展方法允许您向现有类型添加其他方法,而无需更改该类型的定义。在这种情况下,Linq将Average方法添加到IQueryable接口而不改变该接口。
答案 4 :(得分:0)
<TSource>
是方法的通用参数。this IQueryable<TSource> source
表示扩展方法,这是语法糖。在C#2.0中,它只是一个你必须显式调用的静态方法,有了这个,编译器允许你调用它,好像它是你调用它的Type的成员一样。答案 5 :(得分:0)
<X>
用于制作适用于不同类型的通用函数。
X add<X>(X a, X b){return a + b;}
int a = 1;
int b = 2;
int c = add<int>(a,b);
string d = "hello ";
string e = "world";
string f = add<string>(c,d);
这是扩展方法的关键字:
string putinsidestars(this string x){
return "*" + x + "*";
}
string foo = "bar";
string z = foo.putinsidestars();
// z now contains *bar*