ฉันมี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