Це Лінк або Ламбда?


105

Я знаю, що це Linq:

var _Results = from item in _List
                where item.Value == 1
                select item;

І я знаю, що це Лямбда:

var _Results = _List.Where(x => x.Value == 1);

Примітка редактора: вищезгадане не є просто лямбда, це Linq, використовуючи "синтаксис методу", присудком якого є лямбда. Щоб було зрозуміло, обидві вищевказані зразки є Linq (моя початкова публікація була неправильною, але я залишив помилку, щоб проілюструвати плутанину, що спонукає до питання).

Але Лінк є підмножиною Ламбди чи що?

Чому є два, здавалося б, однакових техніка?

Чи є технічна причина вибору одного за іншим?


Відповіді:


135

Це LINQ (з використанням синтаксису запиту):

var _Results = from item in _List
                where item.Value == 1
                select item;

Це також LINQ (з використанням синтаксису методу):

var _Results = _List.Where(x => x.Value == 1);

Цікаво зауважити, що обидва ці аромати в кінцевому підсумку дають такий самий код. Компілятор пропонує вам послугу, дозволяючи висловити свої побажання в обраному вами порядку.

А це лямбда:

x => x.Value == 1

Коли ви вирішили використовувати синтаксис методу, LINQ майже завжди спостерігається навколо лямбда-виразів. Але LINQ і лямбда - це дві абсолютно різні речі, які обидві можна використовувати самі.

Оновлення: Як справедливо зазначає svick, LINQ з синтаксисом запитів також реалізується за допомогою лямбда-виразів (як згадувалося раніше, компілятор дозволяє писати в синтаксис запиту, але ефективно перетворює його на синтаксис методу за вашою спиною). Це просто накопичує той факт, що обидва аромати є абсолютно рівнозначними і будуть вести себе однаково (наприклад, лямбда-вирази можуть спричинити створення закриття ).


2
Я думаю, що варто згадати, що синтаксис запитів також використовує лямбди за лаштунками. Це може бути важливо через закриття.
svick

34

Обидва - Linq. У другому використовується Ламбдас .

Лямбда - це тип вбудованого методу, який ви передаєте як параметр функції Where у другому прикладі.

Різниця між цими двома синтаксисами суто синтаксична. Другий стиль linq з використанням методу викликів - це, як він працює під кришкою. Перший покликаний бути більш зручним / легшим, і компілятор перетворює його на виклики методів за кадром. Вони повинні працювати однаково для будь-якого заданого запиту, хоча, звичайно, компілятор може обрати різко іншу інтерпретацію складного запиту linq, ніж ви б при перетворенні на стиль методу.

Ця стаття msdn може також зацікавити: Синтаксис запитів LINQ проти синтаксису методу . Особливу актуальність має таке: "Загалом ми рекомендуємо синтаксис запитів, оскільки він звичайно простіший і читабельніший; однак між синтаксисом методу та синтаксисом запитів немає семантичної різниці".


6
Особисто я вважаю синтаксис методу більш читабельним - можливо, тому, що більшість мого коду є різноманітністю "LINQ to Objects". Але якщо у вас багато досвіду SQL, можливо, спочатку зрозуміти синтаксис запитів буде простіше.
Том Бушелл

@Tom Bushell, навіть ПРИЄДНАЙТЕ синтаксис? Серйозно?
Джеррі Ніксон

@Tom Bushell: Я теж. Я перефразовував щось на цій сторінці MSDN, що, імовірно, пояснює, чому вони намагаються розробити цей синтаксис, а не просто стиль методу. Я, як правило, просто роблю відносно базові речі, а не приєднуючись чи щось інше складніше (тобто, в основному, фільтрування чи операції зі картою один на один).
Кріс

@Jerry - як і Кріс, дотепер моя робота LINQ була досить простою. Я читав, що синтаксис запитів, як правило, бажано робити SelectMany, Join або GroupJoin - мені просто не потрібно було робити нічого подібного - поки що!
Том Бушелл

1
Внутрішньо "синтаксис запитів" посилався на LINQ в SQL та LINQ на команди команд Entities як "синтаксис розуміння".
DamienG
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.