C# 通过分组linq结果进行预处理的速度非常慢,有什么提示吗?

C# 通过分组linq结果进行预处理的速度非常慢,有什么提示吗?,c#,linq,performance,foreach,C#,Linq,Performance,Foreach,我对正在运行的程序进行了一些评测,最耗时的事情是从linq查询中获取结果: var Results = from a in Table group a by a.Value into b select new {Group = b}; foreach(var Result in Results) { //Do calcs } 有没有关于如何加快速度的想法?我认为您将查询对象与该查询的结果混淆了。第一个变量不包含结果,它包含一个查询对象。此时查询尚未执行。执行

我对正在运行的程序进行了一些评测,最耗时的事情是从linq查询中获取结果:

var Results = 
    from a in Table
    group a by a.Value into b
    select new {Group = b};

foreach(var Result in Results)
{
    //Do calcs
}

有没有关于如何加快速度的想法?

我认为您将查询对象与该查询的结果混淆了。第一个变量不包含结果,它包含一个查询对象。此时查询尚未执行。执行被延迟,直到您实际需要结果为止,在您的示例中,这是在您迭代foreach循环时完成的。这就是为什么第一条语句执行得很快,但迭代很慢

如果要将查询结果存储在
results
中,以便在启动foreach循环时已计算出查询结果,请添加对ToList()的调用


如果您使用的是.NET4,请查看或循环。这将大大提高性能

根据给出的信息无法真正判断,但可能是SQL查询花费的时间太长


如果真正导致瓶颈的是ForEach循环,那么并行ForEach将是您的最佳选择。

我也遇到过同样的问题,一个MSChart只使用了2000个Sqlite记录(索引),显然这是由LINQ group语句查询所有记录造成的


我找到的唯一解决方案是返回本机SQL并立即呈现图表,而不是使用LINQ和SQlite两秒钟。

我认为这里没有足够的信息。什么是桌子?它在打数据库电话吗?什么花了很长时间?只是foreach循环?或者foreach中有什么?看起来像是
select new{Group=b}
可能只是
select b
,但这不会加快速度。分组可能是一项昂贵的操作。若表在数据库中,它是否有值索引?表是SQL数据库中的表,并且有值索引。索引对性能有显著影响吗?是的,但这是一种很好的方式(在获取时),但这会使它(整个发布的代码)更快吗?我对此表示怀疑,但请确定您应该进行度量。不过,它将做的是预先考虑执行成本,以便迭代更快。在我看来,OP更关心的是迭代速度惊人地慢,而不是代码的总运行时间慢。如果你不确定幕后发生了什么,那么你可能会认为第一行是慢行,循环是快行。按productid对其进行分组。在钥匙上做了一个Where,然后跑了过去。花了0.10秒。在IEnumerable上执行ToList后,时间为0.0002秒。我不知道屏幕后面发生了什么。但它有很大的不同。如果它是I/O绑定的(数据库),那么几个额外的线程将不会有多大帮助。我认为这取决于(不可用的详细信息)。这只会对LINQ to对象有潜在的改进,但如果这是使用IQueryable,它不会有多大帮助,因为瓶颈可能在后端。@Reed,是的,就像Henk说的,它完全基于不可用的详细信息。如果foreach循环中正在进行的计算是问题所在,这将有所帮助,或者即使LINQ语句针对对象集合,但我们无法从给出的信息中知道。
var results = 
    (from a in Table
     group a by a.Value into b
     select new {Group = b}).ToList();