2009-02-25 21 views
8

Bây giờ chúng ta có chức năng to lớn nhờ LINQ, tôi tự hỏi cú pháp nào thích hợp hơn. Ví dụ, tôi thấy các phương pháp sau đây (chỉ nghĩ đó là một ví dụ điển hình):Bạn có sử dụng LINQ để thay thế vòng lặp không?

foreach (FixtureImageServicesData image in _fixture.Images) 
{ 
    if (image.Filename != _selectedFixtureImage.Filename && image.IsPrimary) 
    { 
     image.IsPrimary = false; 
     image.IsChanged = true; 
    } 
} 

Nếu chúng ta chuyển nó sang một cách tiếp cận LINQ, nó sẽ giống như thế này (không kiểm tra):

_fixture.Images.Where(x => x.Filename != _selectedFixtureImage.Filename && x.IsPrimary).ForEach(x => { x.IsPrimary = false; x.IsChanged = true; }); 

Bạn muốn xem và duy trì cái nào hơn? Đây là điên rồ hay thiên tài?

Trả lời

22

Sử dụng một phương pháp ForEach mở rộng không quan trọng, nhưng có một cách tiếp cận trung gian:

// Rename 'query' to something meaningful :) 
var query = _fixture.Images 
        .Where(image => _selectedFixtureImage.Filename 
            && image.IsPrimary); 

foreach (FixtureImageServicesData image in query) 
{ 
    image.IsPrimary = false; 
    image.IsChanged = true; 
} 

Nếu bạn làm sử dụng một phương pháp ForEach, tôi chắc chắn muốn định dạng nó trong nhiều dòng:

_fixture.Images 
    .Where(image => _selectedFixtureImage.Filename && image.IsPrimary) 
    .ForEach(image => { image.IsPrimary = false; image.IsChanged = true;}); 

(Giảm thụt dòng để tránh gói ...)

hoặc:

_fixture.Images 
     .Where(image => _selectedFixtureImage.Filename && image.IsPrimary) 
     .ForEach(image => { image.IsPrimary = false; 
          image.IsChanged = true; }); 

Bạn thậm chí có thể muốn trích xuất "làm phi chính" chút vào một phương pháp riêng biệt, lúc này bạn phải:

_fixture.Images 
     .Where(image => _selectedFixtureImage.Filename && image.IsPrimary) 
     .ForEach(MakeNonPrimary); 
+0

Tôi không nghĩ rằng các ví dụ đa dòng của bạn nên có dấu chấm phẩy sau câu lệnh Where. –

+0

@ Joel: Đã sửa, cảm ơn. –

1

Bất cứ điều gì làm giảm độ phức tạp theo chiều dọc hoặc ngang là một cộng với tôi. Ngoài ra, LINQ mô tả nhiều hơn về những gì bạn đang cố gắng thực hiện.

2

Điều này nhắc tôi một chút về "tôi có nên sử dụng chức năng chuỗi hoặc chuỗi chuẩn" hay "tôi nên sử dụng XSLT/XPATH để chuyển đổi XML hoặc sử dụng SelectSingleNode()".

Tùy chọn đầu tiên (ví dụ: Regex/XSLT/LINQ) thường được coi là thanh lịch và mạnh mẽ hơn bởi bất kỳ ai đã dành thời gian học tập.

Trong khi đối với những người khác, nó dường như ít đọc và phức tạp hơn khi so sánh với tùy chọn thứ hai (ví dụ: hàm chuỗi, SelectSingleNode(), vòng lặp foreach đơn giản).

Trong quá khứ tôi đã bị cáo buộc về những điều quá phức tạp bằng cách sử dụng Regex và XSLT/XPATH trong thiết kế của tôi.

Chỉ gần đây tôi bị buộc tội bị "sợ thay đổi" lại bằng cách chọn foreach đơn giản (và ngay cả đối với) vòng trong nhiều tình huống trên LINQ đâu, Foreach, vv

tôi sớm nhận ra rằng những người trong cả hai trường hợp người cho biết đây là loại người cảm thấy rằng có "một cách" để làm tất cả mọi thứ.

Trong khi tôi luôn tìm thấy thông minh hơn nhiều để xem xét từng tình huống về giá trị của nó và chọn đúng công cụ cho công việc. Tôi chỉ bỏ qua chúng và tiếp tục với cách tiếp cận của tôi;)

Đối với tình huống đó bạn mô tả, tùy chọn đầu tiên là thích hợp hơn với tôi. Tuy nhiên, có lẽ tôi sẽ sử dụng phương pháp tiếp cận Linq nếu nhóm của tôi có đủ năng lực trong LINQ, và chúng tôi đã có hướng dẫn mã hóa để tránh một lớp lớn (bằng cách tách chúng ra)

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