C# 使用Linq关闭所有MDI子窗口

C# 使用Linq关闭所有MDI子窗口,c#,winforms,linq,mdichild,mdiparent,C#,Winforms,Linq,Mdichild,Mdiparent,我尝试使用以下循环 foreach (Form frm in this.MdiChildren) { frm.Close(); } 并将其转录成Linq表达式,如下所示: this.MdiParent.MdiChildren.OfType<Form>().ToList().ForEach(x => x.Close()); this.MdiParent.MdiChildren.OfType().ToList().ForEach(x=>x.Close()); 但这一行

我尝试使用以下循环

foreach (Form frm in this.MdiChildren)
{
    frm.Close();
}
并将其转录成Linq表达式,如下所示:

this.MdiParent.MdiChildren.OfType<Form>().ToList().ForEach(x => x.Close());
this.MdiParent.MdiChildren.OfType().ToList().ForEach(x=>x.Close());
但这一行显示了一个
NullReferenceException
“对象引用未设置为对象的实例”

我做错了什么?我是Linq的新手。

试试这个:

this.MdiChildren.OfType<Form>().ToList().ForEach(x => x.Close());
this.mdichilds.OfType().ToList().ForEach(x=>x.Close());
除非您正在从其中一个孩子那里尝试该代码,否则在这种情况下,您将尝试您的代码

this.MdiParent.MdiChildren.OfType<Form>().ToList().ForEach(x => x.Close());
this.MdiParent.MdiChildren.OfType().ToList().ForEach(x=>x.Close());

而且它也应该可以工作。

哪个对象给了你一个nullreferenceexception?虽然它保存了一行(或三行),我还是选择非Linq变量,因为它更容易理解。这通常不是你应该使用Linq的类型。在foreach表单中,它更为普遍和可读。使用LINQ这样做没有好处,因为每个命令都必须按顺序执行。您无法从任何并行化中获益。是的,还有一个事实是它不可读。谢谢你的评论,但是会影响性能吗?是的,这将是为了节省一些线路。因为我之前提到过,我也在学习使用linq(新手),我正在理解它!。它能工作!!我正在尝试关闭所有窗口,这会很有用