2010-03-30 13 views
7

Tôi đã làm theo câu lệnh LINQ và tôi muốn viết lại bằng cách sử dụng các phương pháp mở rộng.Cách thanh lịch để viết lại câu lệnh LINQ sau đây bằng cách sử dụng các phương pháp mở rộng là gì?

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

Một giải pháp khả thi là:

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

Tuy nhiên đây là tất cả mọi thứ nhưng tao nhã.

Bạn có biết cách cải thiện vẻ đẹp của biểu thức thứ hai không?

+0

Bạn có thực sự sử dụng cùng một chuỗi trong tất cả ba mệnh đề 'từ'? –

+2

+1 cho thẻ 'beauty' :-) –

+0

@Jon Skeet: Vâng, đó là ý định. Ví dụ cụ thể này xuất phát từ bài giảng video của Eric Mayers channel9 về lập trình hàm. http://channel9.msdn.com/tags/Functional+Programming/ –

Trả lời

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

Sử dụng Join là cách tiếp cận sai IMO.

Tương đương trực tiếp của việc này là (tôi nghĩ!):

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

Mặc dù tôi nghĩ nó sẽ tương đương với:

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

Trong ý nghĩa của vẻ đẹp 'Tham gia' là cách tiếp cận sai lầm rõ ràng. Theo nghĩa trực giác của đại số đúng đắn (SQL) cho tôi biết điều này sẽ ổn thôi. –

+0

@Jakub: Nó có thể hoạt động, nhưng điều đó không làm cho nó trở thành phương pháp phù hợp. LINQ tương đương của một tham gia chéo (tức là nơi không có "khóa" như vậy) không phải là 'Tham gia', đó là' SelectMany') - mặc dù 'SelectMany' tự cung cấp nhiều chức năng hơn thế này. –

+0

Những cái này có thiếu một parethesis không? –

Các vấn đề liên quan