2010-05-18 4 views
3

Это вопрос о СИНТАКСИС С # и НЕ о том, как мы называем/использовать IQueryableC# синтаксис и Linq, 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

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

Затем

this IQueryable<TSource> source 

указывает первый параметр метода:

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

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

query.Average(s => s.Length) 

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

Queryable.Average(query, s => s.Length) 
+0

Здесь вы можете найти более подробную информацию о методах расширения: http://msdn.microsoft.com/en-us/library/bb383977.aspx Методы расширения используются для 1. Расширьте тип без необходимости его наследования 2. Внедрите методы, которые действительны для всех типов, реализующих определенные интерфейсы. – Thomas

+0

Большое спасибо! Вы ясно дали понять. Не знал синтаксиса для методов расширения! – hdiver

1

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

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

0

TSource является универсальным типом, который вы объявите. В основном это тип s.

0

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

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

+0

Еще один полный ответ! Благодаря! – hdiver

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

Используется для создания общих функций, которые работают с различными типами.

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* 
Смежные вопросы