C#语法和Linq,IQueryable

3
这是关于c#语法的问题,和我们如何调用/使用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);

我知道如何调用IQueryable的平均值和所有类似的静态方法,但是我不理解声明的语法。

public static double Average<TSource>(this IQueryable<TSource> source,
                                      Expression<Func<TSource, int>> selector)

<TSource>Average<TSource>( 中代表数据源的类型。

this IQueryable<TSource> source 表示一个可查询的数据源,其中 TSource 代表数据源中元素的类型。

由于在调用方法时只传递了一个参数,即实际的 lambda 表达式 (s => s.Length);

提前感谢您的帮助。

6个回答

6

<TSource>部分声明了方法的泛型类型参数,基本上是序列包含的元素类型。在深入学习LINQ之前,您一定要理解泛型。

接下来,

this IQueryable<TSource> source

这里的第一个参数表示该方法的:

  • this 表示这是一个扩展方法
  • IQueryable<TSource> 表示参数的类型
  • source 是参数的名称

它是一个扩展方法可能让你感到困惑。当你调用时,

query.Average(s => s.Length)

由编译器转换的。
Queryable.Average(query, s => s.Length)

在这里,您可以找到有关扩展方法的更多信息:http://msdn.microsoft.com/en-us/library/bb383977.aspx 扩展方法用于:
  1. 在不需要继承类型的情况下扩展它
  2. 实现适用于实现特定接口的所有类型的方法
- Thomas
非常感谢!你讲得很清楚。我不知道扩展方法的语法! - hdiver

1

你正在声明一个扩展方法(使用 this 关键字),将你的方法添加到任何实现 IQueryable<TSource> 的类型中,其中 TSource 是泛型类型,并且在整个表达式中保持不变。

编译器可以在这种情况下推断出泛型类型,因此在调用方法时无需声明它。


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*

0

TSource 是你将要声明的泛型类型,它基本上就是 s 的类型。


0

Average<TSource> 是一个泛型方法。只要提供了适当类型的选择器,该方法就可以在任何类型的查询或枚举上运行。

this IQueryable<TSource> source 是一个扩展方法。扩展方法允许您向现有类型添加其他方法,而无需更改该类型的定义。在这种情况下,Linq将Average方法添加到IQueryable接口中,而不会改变该接口


又一个完整的答案!谢谢! - hdiver

0
  1. <TSource> 是该方法的泛型参数。
  2. this IQueryable<TSource> source 表示一个扩展方法,这是语法糖。在 C#2.0 中,它只是一个静态方法,您必须显式调用它,而使用此方法,编译器允许您将其视为您正在调用它的类型的成员。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接