我从事WPF和MVVM的项目已有一段时间了。在项目的一部分中,我使用以下代码关闭了一个窗口。该代码有效,但是,我还不了解该代码背后的逻辑。我的代码是:
App.Current.Windows.Cast<Window>()
.Where(win => win is DisplayView).FirstOrDefault()
.Close();
为什么需要FirstOrDefault()?
最佳答案
它仅使用一些Linq IEnumerable<T>
扩展名从与给定类型匹配的集合中获取第一项,然后在该实例上调用Close
。它实际上是多余的,因为:
App.Current.Windows.Cast<Window>()
.Where(win => win is DisplayView)
大致等于:
App.Current.Windows.OfType<DisplayView>()
另外,在调用
FirstOrDefault()
后再单击“Close”有点愚蠢。 FirstOrDefault类似于First
,不同之处在于它返回null而不是在没有元素的情况下引发异常-但在那种情况下,它还是会引发异常,因为您将在null对象上调用“Close”。所以我会这样写:
App.Current.Windows.OfType<DisplayView>().First().Close();
如果要验证是否确实存在DisplayView实例,并在这种情况下防止出现异常,则可以使用以下方法:
var displayViews = App.Current.Windows.OfType<DisplayView>();
if (displayViews.Any())
displayViews.First().Close();