Tôi hiện đang học F # và tôi thực sự yêu thích toán tử yield!
(yield-bang). Không chỉ cho tên của nó mà còn cho những gì nó làm tất nhiên.Sản lượng F #! nhà điều hành - Thực hiện và có thể C# tương đương
Toán tử yield!
về cơ bản cho phép bạn mang lại tất cả các phần tử của chuỗi từ một biểu thức trình tự. Điều này rất hữu ích cho việc lập các điều tra viên. Vì tôi thường xuyên gặp những người điều tra lớn, phức tạp, tôi quan tâm đến các chiến lược mà chúng ta có thể sử dụng để chia nhỏ chúng và soạn chúng từ những điều tra đơn giản hơn.
Không may, nhà cung cấp yield!
không khả dụng trong C#. Theo như tôi hiểu, những gì nó giống như một foreach (var x in source) yield x;
nhưng cuốn sách tôi đang đọc (Petricek's Real World F# - Manning) cho thấy rằng nó có hiệu suất tốt hơn ...
- Vì vậy, những gì chính xác nào để F # biên dịch làm ở đây? (Có, tôi có thể nhìn vào nó bằng cách sử dụng Reflector quá nhưng tôi muốn có một mô tả chi tiết hơn về cơ chế).
Để đạt được cấu trúc tương tự trong C# Tôi đã khám phá nhiều cách, nhưng không có cách nào ngắn gọn như toán tử yield!
và tôi cũng không chắc chắn về độ phức tạp của chúng. Ai đó có thể vui lòng cung cấp đầu vào nếu số BigO của tôi là chính xác không?
Decompose Enumerator thành nhiều điều tra viên tư nhân và sau đó mang lại mỗi phần tử từ các điều tra viên công cộng:
foreach (var x in part1()) yield x foreach (var x in part2()) yield x
này một cách hiệu quả sẽ dẫn đến một "năng suất tăng gấp đôi" trên mỗi phần tử. Vậy đó là O (2n)? (hoặc có thể tồi tệ hơn?) Dù sao, bằng cách sử dụng cách tiếp cận này ngăn tôi sử dụng
yield break;
từ bất kỳ phân mục nào của tôi.Decompose Enumerator thành nhiều điều tra viên tư nhân và sau đó concat tất cả các điều tra viên tư nhân từ các điều tra viên công cộng:
return part1().Concat(part2())
Tôi tin rằng đây là không có khác biệt so với các giải pháp nói trên vì
Concat()
được thực hiện theo cách tôi đã nêu trên.
Bất kỳ tùy chọn nào khác?
Như giấy bạn trích dẫn chỉ ra, khi được sử dụng đệ quy có trường hợp mà 'yield!' (Tương đương với giả thuyết 'yield foreach' trong C#) là O (n) nhưng 'foreach ... yield return. ..' là O (n^2). – kvb
@kvb: Phải, đó là người tôi đang nói đến, xin lỗi nếu điều này không rõ ràng. –