c#语法和Linq,IQueryable

时间:2010-05-18 11:43:55

标签: c# linq iqueryable

这是关于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);

提前致谢。

6 个答案:

答案 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)

  1. <TSource>是方法的通用参数。
  2. 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*