Tôi có một đoạn mã cho một số logic xác nhận, mà trong khái quát hóa cho đi như thế này:LINQ hoặc foreach - phong cách/dễ đọc và tốc độ
private bool AllItemsAreSatisfactoryV1(IEnumerable<Source> collection)
{
foreach(var foo in collection)
{
Target target = SomeFancyLookup(foo);
if (!target.Satisfactory)
{
return false;
}
}
return true;
}
này hoạt động, là khá dễ hiểu, và có đầu tối ưu hóa. Đó là, tuy nhiên, khá tiết. Mục đích chính của câu hỏi này là những gì được coi là có thể đọc được và phong cách tốt. Tôi cũng quan tâm đến buổi biểu diễn; Tôi tin tưởng rằng sớm {tối ưu hóa, bi quan} là gốc rễ của tất cả các ác và cố gắng tránh tối ưu hóa vi mô cũng như giới thiệu các nút cổ chai.
Tôi khá mới đối với LINQ, vì vậy tôi muốn một số nhận xét về hai phiên bản thay thế mà tôi đã đưa ra, cũng như bất kỳ đề xuất nào khác. dễ đọc.
private bool AllItemsAreSatisfactoryV2(IEnumerable<Source> collection)
{
return null ==
(from foo in collection
where !(SomeFancyLookup(foo).Satisfactory)
select foo).First();
}
private bool AllItemsAreSatisfactoryV3(IEnumerable<Source> collection)
{
return !collection.Any(foo => !SomeFancyLookup(foo).Satisfactory);
}
Tôi không tin rằng V2 cung cấp nhiều hơn V1 về khả năng đọc, ngay cả khi ngắn hơn. Tôi tìm thấy V3 để rõ ràng & súc tích, nhưng tôi không quá thích phần Method().Property
; tất nhiên tôi có thể biến lambda thành một đại biểu đầy đủ, nhưng sau đó nó mất đi sự sang trọng một dòng.
Những gì tôi muốn bình luận trên là:
- Style - bao giờ nên chủ quan, nhưng những gì bạn cảm thấy là có thể đọc được?
- Hiệu suất - có bất kỳ điều gì trong số này không xác định không? Theo như tôi hiểu, cả ba phương pháp đều nên sớm.
- Khả năng gỡ lỗi - bất kỳ điều gì cần xem xét?
- Giải pháp thay thế - mọi thứ đều diễn ra.
Cảm ơn trước :)
Khi đọc LINQ, tôi không bao giờ có thể dễ dàng hiểu được cách "ngôn ngữ tự nhiên" (tất cả các 'từ x trong xs chọn ...'). Phiên bản 'xs.Select (x => ...)' luôn có vẻ rõ ràng hơn và có ý nghĩa hơn với tôi (nhưng đó chỉ là tôi). V3 là dễ đọc nhất đối với tôi. –
@Callum Rogers: Tôi cảm thấy khá giống nhau; những người làm rất nhiều SQL có thể cảm thấy khác nhau, mặc dù :) – snemarch