我有一节课:
public class PointD
{
public double X
{ get; set; }
public double Y
{ get; set; }
public PointD(double x, double y)
{
X = x;
Y=y;
}
//operator for +,-, * and / are overridden
}
Run Code Online (Sandbox Code Playgroud)
给定a list<PointD>,如何使用LINQ获得平均值?一个for等效的循环将是这样的:
double xx, yy;
for ( int i=0; i< ptlist.Count; i++)
{
xx+=ptlist[i].X;
yy+=ptlist[i].Y;
}
return new PointD(){X=xx, Y=yy};
Run Code Online (Sandbox Code Playgroud)
您只能使用任何内置 LINQ函数.您无法定义负责此功能的扩展.
任何的想法?
编辑:当然,Sum在合并它们之前,您可以使用两个单独的扩展方法来求和X和Y组件.但这不是我想要的.我想要的是一个完成这项工作的单一查询/方法
Nol*_*rin 13
这个Aggregate功能在这里会派上用场.
var sum = list.Aggregate((acc, cur) => acc + cur);
var average = list.Aggregate((acc, cur) => acc + cur) / list.Count;
Run Code Online (Sandbox Code Playgroud)
只要确保你有/对类型定义的操作符PointD和int,这应该做的工作.
注意:我不太确定你是否想要这里的总和或平均值(你的问题对此有些模棱两可),但我已经包含了两者的例子.
您将需要使用该Aggregate方法,以便您可以提供自己的聚合函数(Sum这只是此方法的一个方便的特殊情况).就像是:
points.Aggregate(new PointD(0, 0), (a, p) => a + p);
Run Code Online (Sandbox Code Playgroud)
我知道你说你不想要任何额外的方法定义,但如果这是一个常见的操作,我倾向于为此编写一个扩展方法,即
public static PointD Sum(this IEnumerable<PointD> source)
{
return source.Aggregate(new PointD(0, 0), (a, p) => a + p);
}
Run Code Online (Sandbox Code Playgroud)
因为它能够写得更具可读性:
points.Sum();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21678 次 |
| 最近记录: |