ฉันมีIEnumerable<T>วิธีที่ฉันใช้เพื่อค้นหาการควบคุมในหน้า WebForms
วิธีการแบบเรียกซ้ำและฉันมีปัญหาบางอย่างกลับประเภทที่ฉันต้องการเมื่อyield returnเป็นคืนค่าของการโทรซ้ำ
รหัสของฉันมีลักษณะดังนี้:
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>();
}
}
}
ขณะนี้มีข้อผิดพลาด "ไม่สามารถแปลงประเภทการแสดงออก" หากอย่างไรก็ตามวิธีการนี้จะคืนค่าชนิดIEnumerable<Object>รหัสจะสร้างขึ้น แต่จะส่งคืนชนิดที่ไม่ถูกต้องในผลลัพธ์
มีวิธีใช้yield returnในขณะที่ใช้การเรียกซ้ำหรือไม่
if(c.Controls.Count > 0)-> if(c.Controls.Any())โดยเฉพาะถ้าคุณยอม
yieldเพื่อความสมบูรณ์ฉันมีให้ดำเนินการได้โดยไม่ต้อง โปรดดูที่ด้านล่าง :) และมันเป็นหนึ่งซับมากเกินไป :)
yield returnฟังก์ชั่นวนซ้ำการใช้งานหน่วยความจำจะเพิ่มขึ้นอย่างมาก ดูstackoverflow.com/a/30300257/284795