以下面的LINQ查询为例。请不要对代码本身发表评论,因为我只是输入它来帮助解决这个问题。
以下LINQ查询使用“分组依据”并计算摘要信息。正如您所看到的,有许多计算正在对数据执行,但LINQ在幕后的效率如何。
var NinjasGrouped = (from ninja in Ninjas
group pos by new { pos.NinjaClan, pos.NinjaRank }
into con
select new NinjaGroupSummary
{
NinjaClan = con.Key.NinjaClan,
NinjaRank = con.Key.NinjaRank,
NumberOfShoes = con.Sum(x => x.Shoes),
MaxNinjaAge = con.Max(x => x.NinjaAge),
MinNinjaAge = con.Min(x => x.NinjaAge),
ComplicatedCalculation = con.Sum(x => x.NinjaGrade) != 0
? con.Sum(x => x.NinjaRedBloodCellCount)/con.Sum(x => x.NinjaDoctorVisits)
: 0,
ListOfNinjas = con.ToList()
}).ToList();
我们赞赏任何建议,因为我们在整个软件中使用这种类型的代码,我真的希望更好地了解LINQ在幕后做什么(可以这么说)。也许有更好的方法?
答案 0 :(得分:6)
假设这是一个LINQ to Objects查询:
Ninjas
只迭代一次;这些组被构建到内部具体列表中,然后您将多次迭代(每次聚合一次)。foreach
循环几乎肯定不会加快速度 - 你可能会从缓存一致性中受益更多(因为每次迭代一个组时,它可能不得不从更高级别获取数据缓存或主存储器)但我非常怀疑它会很重要。实施它的痛苦增加可能会显着,但是:)AsParallel
可能加快速度 - 它看起来很容易并行化。值得一试...... 您可能需要查看GroupBy
post in my Edulinq blog series,了解有关可能的实施的更多详细信息。