我有一个IEnumerable
{{{1,2},{2,4},{3,6},{4,8}},{{1,2},{2,0},{3,0},{4,-2}},{{1,2},{2,2},{3,0},{4,0}}}检索以下IEnumerable
{{1,2},{2,2},{3,2},{4,2}}
即每个元素的y值的平均值。
性能需要合理,因此不能使用.ToList()或类似功能。我一直在用LINQ尝试各种事情,但无济于事。
@Bort,@Rawling,我已经测试了你的答案,@Rawling的答案稍微快一点。然而,@Bort的答案更具可读性,所以我想我暂时会同意这一点。请随时提供答案!
使用LINQ,您可以使用SelectMany来展平列表列表,然后GroupByx并Select平均值:
varaverages=customObjectLists.SelectMany(l=>l).GroupBy(co=>co.x).Select(g=>newCustomObject{x=>g.Key,y=g.Average(co=>co.y)});这样的东西应该能让你得到你想要的结果。它会将列表列表平展为单个List
varmyComplexObject=//yourIEnumerable
IEnumerable
foreach(varavginAggregateAcross(input,pair=>pair.y,e=>e.Average(y=>y))){Console.WriteLine(avg);}请注意,一旦其中一个内部枚举器用完元素,此操作就会停止。此外,它需要一些东西来在完成后释放所有枚举器。看看这个答案,了解更多的想法。
(另请注意,这完全忽略了x值。由于所有输入都井井有条,并且所需的输出也井井有条,因此x值不会添加任何内容。