Tôi có phương thức IEnumerable<T>
mà tôi đang sử dụng để tìm các điều khiển trong trang WebForms.IEnumerable and Recursion sử dụng lợi tức lợi nhuận
Phương pháp này đệ quy và tôi đang gặp một số sự cố khi trả về loại tôi muốn khi yield return
trả về giá trị của cuộc gọi đệ quy.
Mã của tôi trông như sau:
public static IEnumerable<Control>
GetDeepControlsByType<T>(this Control control)
{
foreach(Control c in control.Controls)
{
if (c is T)
{
yield return c;
}
if(c.Controls.Count > 0)
{
yield return c.GetDeepControlsByType<T>();
}
}
}
này hiện ném một "Không thể chuyển đổi loại khái niệm" lỗi. Tuy nhiên, nếu phương thức này trả về kiểu IEnumerable<Object>
, mã được tạo nhưng loại sai được trả về trong đầu ra.
Có cách nào để sử dụng yield return
trong khi cũng sử dụng đệ quy không?
http://stackoverflow.com/questions/1815497/enumerating-collections-that-are-not-inherently-ienumerable/ 1815600 # 1815600: liên kết tới câu trả lời "mrydengrens" trên chuỗi "Liệt kê các Bộ sưu tập vốn không phải là IEnumerable?" Mã mẫu của ông dựa trên một bài viết trên blog của Eric Lippert cho bạn thấy cách sử dụng các ngăn xếp trong liệt kê đệ quy với LINQ, do đó tránh việc sử dụng bộ nhớ đắt tiền bởi các trình vòng lặp. imho rất hữu ích! – BillW
BTW. 'if (c.Controls.Count> 0)' -> 'if (c.Controls.Any())', đặc biệt nếu bạn cũng đang sinh lợi :) – mayu
Tôi không nghĩ rằng trường hợp này có lợi từ việc sinh lãi. Để hoàn thành, tôi đã cung cấp một triển khai mà không có 'yield'. Xin vui lòng xem dưới đây :) Và đó là một lớp lót quá :) – mayu