2012-11-15 25 views
5

Có tồn tại một mẫu tiêu chuẩn cho lợi nhuận trả lại tất cả các mục trong một số không?Mẫu thích hợp để xử lý Các đối tượng có thể đếm được với lợi nhuận là bao nhiêu?

Thường xuyên hơn tôi thích tôi tìm thấy một số mã của tôi phản ánh mô hình sau:

public IEnumerable<object> YieldReturningFunction() 
    { 

     ... 
     [logic and various standard yield return] 
     ... 

     foreach(object obj in methodReturningEnumerable(x,y,z)) 
     { 
      yield return obj; 
     } 

    } 

Việc sử dụng rõ ràng của một vòng lặp foreach chỉ để trả lại kết quả của một Reeks Enumerable mã mùi với tôi.

Rõ ràng là tôi có thể từ bỏ việc sử dụng lợi nhuận làm tăng độ phức tạp của mã bằng cách xây dựng một cách rõ ràng và thêm kết quả của mỗi lợi nhuận chuẩn trở lại cũng như thêm một dải kết quả của phương pháp ReturningEnumerable . Điều này sẽ không may, vì vậy tôi đã hy vọng có tồn tại một cách tốt hơn để quản lý mẫu trả về lợi nhuận.

+1

Bạn đang yêu cầu "yield foreach', không tồn tại. – SLaks

+3

có thể trùng lặp của [Thu nhập lợi nhuận lồng nhau với IEnumerable] (http://stackoverflow.com/questions/1270024/nested-yield-return-with-ienumerable) – Euphoric

+0

có thể trùng lặp của [Lợi nhuận trở lại nhiều?] (Http: // stackoverflow .com/questions/3851997/yield-return-many) – nawfal

Trả lời

5

Không, không có cách nào xung quanh điều đó.

Đó là một tính năng được yêu cầu và không phải là ý tưởng tồi (yield foreach hoặc tương đương tồn tại ở các ngôn ngữ khác).

Tại thời điểm này, Microsoft đã không chỉ định thời gian và tiền bạc để triển khai. Họ có thể hoặc không thể thực hiện nó trong tương lai; Tôi đoán (không có cơ sở thực tế) rằng nó ở đâu đó trong danh sách việc cần làm; nó chỉ đơn giản là một câu hỏi nếu/khi nó đủ cao trên danh sách đó để thực sự được triển khai.

Chỉ có thể thay đổi mà tôi có thể xem là cấu trúc lại tất cả các cá nhân yield returns từ đầu phương pháp vào phương thức trả về tự động của riêng mình, sau đó thêm phương thức mới trả về kết nối của phương thức đó và methodReturningEnumerable(x,y,z) . Nó sẽ tốt hơn; không, có lẽ là không. Các Concat sẽ thêm trở lại trong nhiều như bạn đã có thể lưu, nếu không nhiều hơn.

+1

Tôi đánh dấu đây là câu trả lời được chấp nhận không phải vì nó mang lại cho tôi câu trả lời mà tôi đang tìm kiếm, nhưng bởi vì nó giải thích đủ để giải thích tại sao câu trả lời tôi đang tìm kiếm không (chưa) tồn tại. – rheone

2

Không thể hoàn thành. Nó không phải là xấu mặc dù. Bạn có thể rút ngắn nó thành một dòng:

foreach (var o in otherEnumerator) yield return o; 

Lưu ý không liên quan: bạn nên cẩn thận về logic bạn đưa vào máy phát; tất cả việc thực hiện được hoãn lại cho đến khi GetEnumerator() được gọi trên trả lại IEnumerable. Tôi bắt mình ném NullArgumentException s không chính xác theo cách này thường xuyên đến nỗi tôi nghĩ nó đáng nói đến. :)

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