我从事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();

10-07 22:49