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

C# Linq比foreach快吗?如何用它替换循环?,c#,linq,loops,optimization,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();

我想完全移除foreach

这是我的密码

foreach (var user in elite.Users)
{
    if (user.UserName==txtuser.Text && user.UserPWD==txtpass.Text)
    {                    
        MainForm mainForm = new MainForm();
        mainForm.ShowDialog();
        Hide();
        Close();
    }
}
在引擎盖下,Linq或(几乎)与执行foreach相同

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

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

您还可以通过使用使用使用多线程的TLP()或PLINQ()来加快迭代


在某些情况下(我甚至可以说大多数情况下),使用多线程可能比执行同步迭代要慢。它也会使代码变得更加复杂,如果不理解,常常会导致应用程序中的许多错误。

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();
}
正如您所看到的,代码本身在这里没有任何好处,在这样简单的事情上,它不会执行得更快,也不会执行得更慢

因为,林克做了什么?不知怎的,它确实有一种力量


当您创建和显示对话框时,我认为foreach的任何潜在开销都不是问题。你能帮我们理解你从哪里知道foreach的速度如此之慢吗?你有这方面的文档吗,或者有任何代码来演示它吗?我这样问是因为我经常使用foreach,它对我来说并不慢。此外,如果LINQ正在做任何类似循环的事情,这意味着在您调用的某个方法中存在一个实际的循环。为什么您认为LINQ表达式的速度会高于
foreach
?你认为它们是如何实施的?此外,LINQ用于查询(这是
Q
的意思),而不是像这样的副作用。而不是为每个用户提供一个新的、相同的表单,考虑对每个用户使用一个表单实例,在从数据库检索数据后,使用LINQ表达式进行计算,其速度比循环快大约10倍。<代码>对于<代码>比<>代码>前缀要比LINQTO对象的<代码> LINQ快。对于LINQ到EF/EF Core/SQL,LINQ可能比foreach快,这取决于查询的性质以及数据库服务器的类型和速度,因为查询要么在数据库端(EF/EF Core 3/SQL)执行,要么在数据库服务器和客户端之间分割(EF Core<3)。一般来说,你不能说一个比另一个快,但是如果你不使用一个复杂的数据库查询到一个快速的服务器,LINQ将比
foreach
慢。循环需要1300毫秒(表有一行),我认为这里的慢是因为使用实体框架6.3。EF很慢,但效率很高。可以使用Any()代替Where()