哪个是最快的,Loop或FirstOrDefault()

时间:2015-02-19 09:33:04

标签: c# .net wpf foreach

我正在尝试提高WPF应用程序的性能,因为我的用户对系统的某个部分似乎存在性能问题这一事实感到悲伤。有问题的部分是一个显示登录用户的屏幕。缓慢的部分通过以下方式将它们记录下来:扫描其员工参考并找到他们的子控制并将其从父项中删除,即将其记录下来。这当前使用循环。

foreach (var userControl in UsersStackPanel.Children)
{
    if (userControl.Employee.EmpRef == employee.EmpRef)
    {                  
        // plus some DB stuff here
        UsersStackPanel.Children.Remove(userControl);                              
        break;
    }
}

但是我有一个替代方案,

var LoggedInUser = (UI.Controls.Generic.User)UsersStackPanel.Children
                       .OfType<FrameworkElement>()
                       .FirstOrDefault(e => e.Name == "EmpRef" + employee.EmpRef);
if (LoggedInUser != null)
{
    // some DB stuff here
    UsersStackPanel.Children.Remove(LoggedInUser);

}

我已经定时使用秒表类,但结果并没有指向哪个更好,它们都返回0毫秒。我想知道数据库部分是否是瓶颈,我只是想我会从屏幕开始改进那里以及数据库更新。 任何想法都赞赏。 丹

1 个答案:

答案 0 :(得分:1)

在我看来,你的第二个例子看起来应该更像这样:

UI.Controls.Generic.User LoggedInUser = UsersStackPanel.Children
    .OfType<UI.Controls.Generic.User>()
    .FirstOrDefault(e => e.Employee.EmpRef == employee.EmpRef);
if (LoggedInUser != null)
{
    // some DB stuff here
    UsersStackPanel.Children.Remove(LoggedInUser);
}

但是,除非你的StackPanel中有成千上万的控件(如果你这样做,你有比这个循环还要大的鱼),数据库访问将完全淹没并使任何性能差异无关紧要在两种循环技术中。

在你的问题中没有足够的上下文来确定这里要做的正确的事情是什么,但是在保持UI响应方面,最有可能你想要做的就是将数据库访问包装在一个辅助方法,然后将该方法作为等待任务执行,例如await Task.Run(() => DoSomeDBStuff());这将让UI线程(可能是执行您发布的代码的线程)在数据库操作继续时继续工作。完成数据库工作后,您的方法将在下一个语句继续执行,即调用Remove()方法。