Синтаксис C # и Linq, IQueryable - PullRequest
3 голосов
/ 18 мая 2010

Это вопрос о SYNTAX из c # и 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);

Я понимаю, как вызывать Среднее и все подобные статические методы IQueryable но я не понимаю синтаксис объявления.

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

Что означает <TSource> в Average<TSource>( а также this IQueryable<TSource> source.

, так как при его вызове передается только один параметр и фактическое лямбда-выражение (s => s.Length);

Заранее спасибо.

Ответы [ 6 ]

6 голосов
/ 18 мая 2010

Часть <TSource> объявляет параметры универсального типа метода - в основном, какой элемент содержит последовательность Вы должны определенно понимать дженерики, прежде чем углубляться в LINQ.

Тогда

this IQueryable<TSource> source

обозначает первый параметр метода:

  • this указывает, что это метод расширения
  • IQueryable<TSource> указывает тип параметра
  • source - имя параметра

Тот факт, что это метод расширения, вероятно, сбивает вас с толку. Когда вы звоните

query.Average(s => s.Length)

, который конвертируется компилятором в

Queryable.Average(query, s => s.Length)
1 голос
/ 18 мая 2010

Вы объявляете метод расширения (это ключевое слово this), который добавляет ваш метод к любому типу, реализующему IQueryable<TSource>, где TSource - универсальный тип, и остается неизменным во всем выражении.

Компилятор может определить обобщенный тип в этом случае, поэтому вам не нужно объявлять его при вызове метода

0 голосов
/ 18 мая 2010

<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 голосов
/ 18 мая 2010
  1. <TSource> - это общий параметр метода.
  2. this IQueryable<TSource> source обозначает метод расширения, это синтаксический сахар. В C # 2.0 это был бы просто статический метод, который вы должны вызывать явно, с этим компилятор позволяет вам вызывать его так, как если бы он был членом типа, для которого вы его вызываете.
0 голосов
/ 18 мая 2010

Average<TSource> потому что это универсальный метод .Метод может быть запущен для запроса или перечисления для любого типа (при условии, что предоставляется подходящий селектор для этого типа).

this IQueryable<TSource> source, поскольку это расширение Метод .Методы расширения позволяют добавлять дополнительные методы к существующим типам, не изменяя определение этого типа.В этом случае Linq добавляет метод Average к интерфейсу IQueryable без изменения этого интерфейса .

0 голосов
/ 18 мая 2010

TSource - это общий тип, который вы объявите. Это в основном тип s.

...