Почему лямбда здесь в коде? - PullRequest
2 голосов
/ 23 февраля 2011

Я нашел пример кода, где лямбда-код использовался следующим образом

var sumOfgreaterThanSeven = numbers.Sum(n => n > 7 ? n : 0);

, но вышеприведенный код можно записать как

var sumOfgreaterThanSeven = numbers.Sum(n > 7 ? n : 0);

, так почему пользователь пишет лямбда-код.Пожалуйста, помогите мне понять, почему пользователь пишет лямбда здесь.Также скажите мне, в чем преимущество лямбды.спасибо

Ответы [ 3 ]

12 голосов
/ 23 февраля 2011

Лямбда, потому что вы хотите оценить условное выражение для элемента n.Добавленная версия (Sum(n > 7 ? n : 0)) не может работать - n нигде не определена (сообщение компилятора должно быть «Имя n не существует в текущем контексте»).

Лямбда может читаться как:

с учетом термина n, если n больше 7 return n, иначе возвращаем 0

и затем суммируем по этой логике.

Re преимущество - во-первых, удобство - но также состав .Например, с LINQ-to-SQL я абсолютно ожидаю, что для выдачи чего-то вроде:

 select sum(case when row.col > 7 then row.col else 0 end)
 from sometable row

, конечно, может быть лучше использовать:

 var sumOfgreaterThanSeven = numbers.Where(n => n > 7).Sum();

, который отобразитдо

 select sum(row.col)
 from sometable row
 where row.col > 7

, что может более точно попасть в индекс

2 голосов
/ 23 февраля 2011

Вы должны думать о лямбда-выражениях как о методах.

n => n > 7 ? n : 0

Фактически может быть записано как

(n) => {
    if(n > 7)
        return n;
    else
        return 0;
    }   

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

UPDATE

Как отметил Марк, это преобразование в анонимный метод и экземпляр Func<> или Action не всегда происходит - как правильно указано в Linq-to-sql. ... - но здесь это так, поэтому я указал на основную.

2 голосов
/ 23 февраля 2011

Когда вы пишете лямбду, вы вызываете метод или вычисляете выражение.Левая часть => - это набор параметров, переданных в метод / выражение с правой стороны.

IEnumerableThing.Where(a => DoSomeStuff(a))

Это похоже на запись:

foreach (var a in IEnumerableThing)
{
   DoSomeStuff(a);
}

В случаеSum() метод вы действительно делаете что-то вроде этого:

int mysum = 0;

foreach (var n in whatever)
{
   if (n > 7) { mysum += n; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...