2010-03-30 6 views
7

LINQ deyimini takip ediyorum ve uzantı yöntemlerini kullanarak yeniden yazmak istiyorum.Aşağıdaki LINQ deyimini uzantı yöntemlerini kullanarak yeniden yazmanın zarif yolu nedir?

from x in e 
from y in e 
from z in e 
select new { x, z } 

olası bir çözümdür:

e.Join(e, x => 42, y => 42, (x, y) => new { x, y }) 
    Join(e, _ => 42, z => 42, (_, z) => new { _.x, z }); 

Ancak bu zarif ama her şeydir.

İkinci ifadenin güzelliğini nasıl geliştireceğinizi biliyor musunuz?

+0

gerçekten aynı sırayı kullanıyor musunuz her üç '' '' cümlelerinde? –

+2

+1 güzellik etiketinde :-) –

+0

@Jon Skeet: Evet, niyet bu. Bu özel örnek, fonksiyonel programlama hakkında Eric Mayers kanal9 video dersinden geliyor. http://channel9.msdn.com/tags/Functional+Programming/ –

cevap

6
e.SelectMany(x => e.SelectMany(y => e.Select(z => new { x, z }))) 
6

Join kullanmak yanlış bir yaklaşım IMO'dur.

bu doğrudan eşdeğer (sanırım!) Olduğu:

e.SelectMany(x => e.SelectMany(y => e.Select(new { y, z }), 
      (x, yz) => new { x, yz.z })) 

ben düşünmek rağmen hiç o eşdeğer olacaktır:

e.SelectMany(x => e.SelectMany(y => e.Select(new { x, z }))) 
+0

Güzellik anlamında 'Join' açıkça yanlış bir yaklaşımdır. Doğruluk anlamında ilişkisel cebir (SQL) sezgisi bana bunun iyi olması gerektiğini söyler. –

+0

@Jakub: Çalışabilir, ancak bu doğru bir yaklaşım değil. Bir çapraz katılımın LINQ eşdeğeri (diğer bir deyişle "anahtarlar" yoktur), "Birleştir" değil, "SelectMany" değil) - SelectMany'in kendisi bundan daha fazla işlevsellik sağlasa bile. –

+0

Bunların her biri bir paretik eksik midir? –

İlgili konular