Первый: краткость и локальность :
Что бы вы предпочли писать, читать и поддерживать?Это:
var addresses = customers.Select(customer=>customer.Address);
или:
static private Address GetAddress(Customer customer)
{
return customer.Address;
}
... a thousand lines later ...
var addresses = customers.Select(GetAddress);
Какой смысл загромождать вашу программу сотнями или тысячами четырехстрочных функций, когда вы можете просто поместить нужный код где вам это нужно в качестве краткого выражения?
Секунда: лямбды закрываются над локальными областями
Что бы вы предпочли читать, писать и поддерживать, это:
var currentCity = GetCurrentCity();
var addresses = customers.Where(c=>c.City == currentCity).Select(c=>c.Address);
или:
static private Address GetAddress(Customer customer)
{
return customer.Address;
}
private class CityGetter
{
public string currentCity;
public bool DoesCityMatch(Customer customer)
{
return customer.City == this.currentCity;
}
}
....
var currentCityGetter = new CityGetter();
currentCityGetter.currentCity = GetCurrentCity();
var addresses = customers.Where(currentCityGetter.DoesCityMatch).Select(GetAddress);
Весь этот неприятный код написан для вас, когда вы используете лямбду.
Третье: Понимание запросов переписывается для вас в lambdas
Когда вы пишете:
var addresses = from customer in customers
where customer.City == currentCity
select customer.Address;
, оно преобразуется в синтаксис лямбды для вас,Многие люди находят этот синтаксис приятным для чтения, но нам нужен лямбда-синтаксис, чтобы реально заставить его работать.
Четвертый: лямбда-символы по выбору определяются
Примечаниечто нам не нужно указывать тип «customer» в понимании запросов выше или в лямбда-версиях, но мы должны указывать тип формального параметра при объявлении его как статического метода.Компилятор умеет выводить тип лямбда-параметра из контекста.Это делает ваш код менее избыточным и более понятным.
Пятый: Лямбды могут стать деревьями выражений
Предположим, вы хотите попросить веб-сервер «отправить мне адресаклиенты, которые живут в текущем городе. "Вы хотите (1) снять миллион клиентов с веб-сайта и выполнить фильтрацию на своем клиентском компьютере, или (2) отправить веб-сайту объект, который сообщает ему: «запрос содержит фильтр текущего города, а затемВыбор адреса "?Пусть сервер выполнит работу и отправит вам только соответствующий результат.
Деревья выражений позволяют компилятору преобразовывать лямбда-код в код, который может быть преобразован в другой формат запроса во время выполнения и отправлен на сервер для обработки.Маленькие вспомогательные методы, которые запускаются на клиенте, этого не делают.