【发布时间】:2026-01-21 09:25:01
【问题描述】:
我有一个 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 的同时也使用递归?
【问题讨论】:
-
*.com/questions/1815497/… :链接到线程“枚举不是固有 IEnumerable 的集合?”上的“mrydengrens”答案他的示例代码基于 Eric Lippert 的一篇博客文章,该文章向您展示了如何在 Linq 的递归枚举中使用堆栈,从而避免迭代器可能使用昂贵的内存。恕我直言非常有用!
-
顺便说一句。
if(c.Controls.Count > 0)-->if(c.Controls.Any()),特别是如果你也在屈服:) -
我认为这种情况不会从屈服中受益。为了完整起见,我提供了一个没有
yield的实现。请看下面:)而且它也是单行的:) -
你应该小心避免在递归函数中使用
yield return,内存使用量会爆炸式增长。见*.com/a/30300257/284795
标签: c# generics ienumerable yield