Linq比foreach快吗?如何用它替换循环?

时间:2019-10-01 18:59:58

标签: c# linq loops optimization

我想完全删除foreach。

这是我的代码

foreach (var user in elite.Users)
{
    if (user.UserName==txtuser.Text && user.UserPWD==txtpass.Text)
    {                    
        MainForm mainForm = new MainForm();
        mainForm.ShowDialog();
        Hide();
        Close();
    }
}

2 个答案:

答案 0 :(得分:1)

在后台,Linq或Language Integrated Query(几乎)与执行foreach相同。

LINQ并不快,并且可以说比foreach慢。它使用很多,因为它可以简化和缩短代码。

如果您想提高迭代的性能,请考虑在可能的情况下添加breakcontinue语句。

您还可以使用TLP(Task Parallel Library)或PLINQ(Parallel LINQ)(它们使用多线程)来加快迭代速度。

在某些情况下(甚至我要说大多数),使用多线程比执行同步迭代要慢。这还会使您的代码更加复杂,并且如果不理解,通常是应用程序中许多错误的来源。

答案 1 :(得分:0)

Linq不一定更快:这是一个神话

Linq使用很多方法调用,这需要花费大量的cpu周期...

当然,Linq经过了优化,可以在几次调用中发出证明,有时甚至比内部人员编写的代码还要快。

但是,根据所处理对象的类型,Linq需要大量资源,有时会变慢。

与Linq一起问的问题首先是代码的质量,简洁性,健壮性和可维护性,这是一个奇迹

对于您的代码,您不需要Linq,并且运行速度不会更快。

您可以在if范围的末尾添加一个分隔符,以便在找到用户后停止解析:

foreach (var user in elite.Users)
  if ( user.UserName == txtuser.Text && user.UserPWD == txtpass.Text )
  {                    
      MainForm mainForm = new MainForm();
      mainForm.ShowDialog();
      Hide();
      Close();
      break;
  }

使用Linq,您可以编写:

if ( elite.Users.Any(user => user.UserName == txtuser.Text 
                          && user.UserPWD == txtpass.Text) )
{
  MainForm mainForm = new MainForm();
  mainForm.ShowDialog();
  Hide();
  Close();
}

如您所见,您在代码本身上没有收获,并且在这样简单的事情上,它不会更快或更慢地执行。

因为,Linq是什么?它以某种方式做了一个foreach ...

https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,e73922753675387a,references

https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,8087366974af11d2