Синтаксис лямбда-выражения - PullRequest
7 голосов
/ 22 февраля 2011

Обязательно ли использовать лямбда-выражение при использовании LINQ, или лямбда-выражения необязательны?

В лямбда-выражениях всегда используется знак =>. Что это значит?

 customers.Where(c => c.City == "London"); 

Здесь c => используется, но почему? Какой смысл использования c =>. Пожалуйста, обсудите подробно, потому что я не знаю лямбда.

Ответы [ 7 ]

11 голосов
/ 22 февраля 2011

Нет, у вас нет для использования лямбда-выражения.Например, ваш Where пример может быть записан как:

private static bool IsLondon(Customer customer)
{
    return customer.City == "London";
}

...

var londoners = customers.Where(IsLondon);

Это предполагает, конечно, LINQ to Objects.Для LINQ to SQL и т. Д. Вам нужно построить дерево выражений.

Относительно того, почему «=>» всегда используется в лямбда-выражении, это просто потому, что оператор пишется именно так - это какспрашивая, почему "+" используется для сложения.

Лямбда-выражение "c => ..." эффективно дает лямбда-выражению параметр , называемый c ... inв этом случае логический вывод типа дает тип из c.Тело предоставляет либо действие для выполнения, либо некоторое вычисление для возврата значения на основе c.

Полное описание лямбда-выражений выходит за рамки этого ответа.Однако, как вопиющая заглушка для моей книги , они подробно описаны в главе 9 C # in Depth.

7 голосов
/ 22 февраля 2011

Лямбда-выражение

c => c.City == "London"

является сокращением для чего-то вроде

bool IsCustomerInLondon(Customer c)
{
  return (c.City == "London");
}

Это просто очень краткий способ написания простой функции, которая возвращает значение. Она называется «анонимная функция», потому что ей никогда не присваивается имя или формальное определение (типы параметров и возвращаемый тип выводятся из контекста).

(На самом деле это не , а просто сокращение; лямбда-выражения связаны с некоторыми другими конструкциями, называемыми замыканиями , которые являются очень крутыми и мощными инструментами.)

4 голосов
/ 22 февраля 2011

Думайте о лямбдах как об анонимных функциях. Я попытаюсь объяснить это следующим кодом.

public bool IsLondon(Customer customer)
{
    return customer.City == "London";
}

Теперь мы сокращаем имя функции и избавляемся от скобок:

public bool Customer customer    
    return customer.City == "London";

Нам не нужен возвращаемый тип, потому что компилятор может выводить тип из выражения:

 customer.City == "London";

Таким же образом компилятор знает о типе ввода, поэтому нам не нужно его указывать.

Итак, в общем, то, что мы оставили, это

customer
   return customer.City == "London";

А лямбда-синтаксис в c # в основном:

(parameter list) => "expression"

Вы также можете писать «многострочные» выражения, но тогда вам нужно окружить свой код фигурными скобками. Также вам нужно будет использовать выражение «возврат», как обычно.

1 голос
/ 04 марта 2011

Нет, в этом нет необходимости.

У нас есть два способа написания запросов LINQ.

Один из них - это метод запроса, а другой - метод построителя.Вам нужно только поставить лямбда-выражение в случае метода компоновщика.Например, если мы хотим найти всех учеников из объекта «Студенты», у которых больше отметок, чем 70. Но мы можем сделать это в LINQ со следующим синтаксисом

   var data = from p in stdList
   where p.marks > 70
   select p;

или var data = stdList.Where (p => p.marks> 70);

более поздний подход - метод конструктора, в котором функция, где мы передаем лямбда-выражения.

Лямбда-выражения - это всего лишь короткие пути выполнения действий, которые вы всегда можетеиспользовать запросы LINQ, но если вы хотите избежать всего синтаксиса запроса для простого применения простого условия, вы можете просто использовать методы построителя LINQ (который запрашивает лямбда-выражения) в лямбда-выражениях, вы всегда определяете какой-то псевдоним и затем выполняете свою операцию.

Что касается оператора =>, он работает так же, как оператор присваивания.Например:

(p) => p.Gender == “F”
It means  “All persons  p, such that person’s Gender is F”

В некоторых литературах это называется «предикатом».Другая литературная терминология - «Проекция»

(p) => p.Gender ? “F” : “Female”
“Each person p becomes string “Female” if Gender is “F”” 

Это проекция, в которой используется троичный оператор.Хотя я объяснил очень простыми примерами, но я надеюсь, что это поможет вам.,,:)

1 голос
/ 22 февраля 2011

вам не нужно использовать лямбда-выражения в Lİnq to sql или Entities; вот альтернативный способ вашего кода;

Ваш код:

customers.Where(c => c.City == "London");

другой путь;

  var query = from cs in customers
              where cs.City == "London"
              select cs;

это другой способ. это зависит от вас.

1 голос
/ 22 февраля 2011

Джон уже ответил, но я хотел бы добавить это.

В приведенном вами примере представьте, что Linq зацикливается на всех клиентах, а c - это просто ссылка на каждый элемент в перечисляемом:

var result = new List<Customer>();
foreach(var c in customers)
{
     if (c.City == "London")
        result.Add(c);   
}
return result;

Это переменная, как и любая другая, она не обязательно должна быть именованной, но это просто соглашение какого-то рода.

1 голос
/ 22 февраля 2011

Лямбда и linq совершенно разные.Вы можете использовать одно без использования другого (есть части linq, которые зависят от лямбда-выражений, но мы хотим сделать это простым :-))

Лямбда-выражение - это анонимная функция, которая может содержатьвыражения и операторы, и могут быть использованы для создания делегатов или типов деревьев выражений.

Это было из MSDN.(http://msdn.microsoft.com/en-us/library/bb397687.aspx)

Чтобы сделать его коротким (это намного сложнее), вы можете использовать лямбда-выражение для создания локальной функции.то, что вы ставите перед => (в вашем примере c) будет параметром функции.Возвращаемый тип «обнаруживается» компилятором C #.

c => c.City == "London" почти эквивалентен:

delegate (TheObjectTypeOfC c) {
   return c.City == London
};

(разница в том, что некоторые лямбда-выражения являются делегатами, а также выражениями, нопожалуйста, игнорируйте это, вам это не понадобится какое-то время)

Если / когда компилятор не может определить типы параметров, вы можете принудительно задать их: (MyObject p) => p.SomeProperty != null.Здесь вы говорите компилятору, что p является параметром.

В то время как здесь я показал вам то, что называется «лямбда-выражениями выражения», вы даже можете сделать «лямбда-выражения»:

p => {
   for (int i = 0; i < 10; i++) {
       if (p.SomeProperty == 0) {
          return true;
       }
   }

   return false;
}

(Я не буду рассказывать вам, в чем «закулисные» различия между лямбдами выражений и лямбдами выражений. Если вы хотите их узнать, прочитайте страницу msdn, на которую я указывал ранее)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...