Tôi đang cố gắng xác định xem có sự thay đổi nào trong tương đương Big O của vòng lặp lồng nhau hay không khi tôi sử dụng lựa chọn LINQ thay thế.
public void myFunc(List<Foo> fooList, List<Bar> barList)
{
foreach(Foo foo in fooList)
{
foreach(Bar bar in barList)
{
if(foo.PropA == bar.PropA && bar.PropZ.HasValue)
foo.PropC = foo.PropB * bar.PropZ;
}
}
}
Tôi tin rằng ví dụ vòng lặp lồng nhau này là O (n ^ 2) vì độ phức tạp.
Tôi đã thay thế vòng lặp lồng nhau bằng một LINQ chọn như thế này:
public void myFunc(List<Foo> fooList, List<Bar> barList)
{
foreach(Foo foo in fooList)
{
Bar bar = (from b in barList
where foo.PropA == b.PropA
select b).FirstOrDefault();
if(bar.PropZ.HasValue)
foo.PropC = foo.PropB * bar.PropZ;
}
}
Nếu không có gì khác, mã dường như sạch hơn một chút để đọc vì nó tuyên bố rõ ràng "chúng tôi đang tìm kiếm đặc biệt này Bar
để làm việc với."
Câu hỏi của tôi là : Việc sử dụng LINQ có làm giảm độ phức tạp Big O không?
bar
s và lọc bar.PropZ.HasValue
trước, nếu bạn mong đợi nhiều hơn một lượng nhỏ để đánh giá thành sai? Không thực sự trả lời câu hỏi của bạn, tôi chỉ đang xem lại mã của bạn.
foo.PropA == bar.PropA
đúng với nhiều mục trong barList
? Chỉnh sửa: chắc chắn không phải là thứ hai sẽ ném một NullReferenceException
khi lựa chọn trở lại null
.
.FirstOrDefault()
sẽ làm cho vòng lặp linq thoát ra sớm nếu một trận đấu được tìm thấy, trong khi các vòng lặp lồng nhau câm lặng của bạn không thoát ra sớm, vì vậy, tôi nghĩ rằng linq sẽ có một trận đấu lớn hơn. Nhưng tôi không chắc chắn, do đó một bình luận và không một câu trả lời.