Linq mi yoksa Lambda mı?


105

Bunun Linq olduğunu biliyorum:

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

Ve bunun Lambda olduğunu biliyorum:

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

Editörün notu: Yukarıdakiler yalnızca Lambda değil, koşulu Lambda olan "Yöntem Sözdizimi" kullanan Linq'tir. Açık olmak gerekirse, yukarıdaki örneklerin her ikisi de Linq'dir (orijinal gönderim yanlıştı, ancak soruyu soran karışıklığı göstermek için hatayı bıraktım).

Ancak Linq, Lambda'nın bir alt kümesi mi yoksa ne?

Neden görünüşte aynı iki teknoloji var?

Birini diğerine tercih etmenin teknik bir nedeni var mı?


Yanıtlar:


135

Bu LINQ (sorgu sözdizimini kullanarak):

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

Bu aynı zamanda LINQ'dur (yöntem sözdizimini kullanarak):

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

İlginçtir ki , bu lezzetlerin her ikisi de aynı kodu üretecektir. Derleyici, isteklerinizi tercih ettiğiniz şekilde ifade etmenize izin vererek size bir hizmet sunar.

Ve bu bir lambda:

x => x.Value == 1

Yöntem sözdizimini kullanmayı seçtiğinizde, LINQ neredeyse her zaman lambda ifadeleri etrafında görülür. Ancak LINQ ve lambdalar birbirinden tamamen farklı iki şeydir ve her ikisi de kendi başlarına kullanılabilir.

Güncelleme: svick'in haklı olarak işaret ettiği gibi, LINQ ile sorgu sözdizimi lambda ifadeleri kullanılarak da uygulanır (daha önce belirtildiği gibi, derleyici sorgu sözdiziminde yazmanıza izin verir, ancak bunu etkili bir şekilde arkanızdan yöntem sözdizimine dönüştürür). Bu, her iki çeşidin de tamamen eşdeğer olduğu ve aynı şekilde davranacağı gerçeğine dayanmaktadır (örneğin, lambda ifadeleri kapanışların oluşturulmasına neden olabilir ).


2
Sorgu sözdiziminin perde arkasında lambdaları da kullandığından bahsetmeye değer olduğunu düşünüyorum. Bu, kapanmalar nedeniyle önemli olabilir.
svick

34

İkisi de Linq. İkincisi, Lambdas kullanıyor .

Lambdalar, ikinci örnekte Where işlevine parametre olarak aktardığınız satır içi yöntem türü şeylerdir.

Bu iki sözdizimi arasındaki fark tamamen sözdizimseldir. Yöntem çağrılarını kullanan ikinci linq stili, başlık altında nasıl çalıştığıdır. İlki, daha kullanıcı dostu / daha kolay olması amaçlanmıştır ve derleyici bunu arka planda yöntem çağrılarına dönüştürür. Herhangi bir sorgu için aynı şekilde çalışmaları gerekir, ancak elbette derleyici karmaşık bir linq sorgusunun yöntem stiline dönüştürürken yapacağınızdan biraz farklı bir yorumunu seçebilir.

Bu msdn makalesi de ilgi çekici olabilir: LINQ Sorgu Sözdizimi ve Yöntem Sözdizimi . Özellikle alaka düzeyi şudur: "Genel olarak, daha basit ve daha okunaklı olduğu için sorgu sözdizimini öneririz; ancak yöntem sözdizimi ile sorgu sözdizimi arasında anlamsal bir fark yoktur."


6
Kişisel olarak, yöntem sözdizimini daha okunaklı buluyorum - belki de kodumun çoğu "LINQ to Objects" türünde olduğu için. Ancak çok fazla SQL deneyiminiz varsa, belki de sorgu sözdiziminin ilk başta anlaşılması daha kolay olacaktır.
Tom Bushell

@Tom Bushell, hatta JOIN sözdizimi? Ciddi anlamda?
Jerry Nixon

@Tom Bushell: Ben de. O MSDN sayfasında, muhtemelen sadece yöntem stiline sahip olmak yerine neden bu sözdizimini geliştirmekle uğraştıklarını açıklayan bir şeyi açıklıyordum. Genelde birleştirme veya daha karmaşık başka şeyler yerine nispeten basit şeyler yapıyorum (yani çoğunlukla filtreleme veya bire bir haritalama işlemleri).
Chris

@ Jerry - Chris gibi, LINQ çalışmalarım şu ana kadar oldukça basitti. Sorgu Sözdiziminin SelectMany, Join veya GroupJoin yaparken genellikle tercih edildiğini okudum - sadece böyle bir şey yapmam gerekmedi - henüz!
Tom Bushell

1
Dahili olarak "sorgu sözdizimi" LINQ to SQL ve LINQ to Entities ekiplerinde "kavrama sözdizimi" olarak adlandırılıyordu.
DamienG
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.