Mit LINQ to Get Summe/ Durchschnitt einer Liste mit benutzerdefinierten Objekten
Ich habe eine Klasse:
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
}
Gegeben list<PointD>
, wie man den Durchschnitt mit LINQ? Ein for
- Schleife äquivalent so etwas wie dieses:
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};
Können Sie alle built-in LINQ-Funktion nur. Sie können nicht definieren, eine Erweiterung, übernimmt diese Funktion.
Irgendeine Idee?
Edit: natürlich, können Sie zwei separate Sum
Erweiterung Methode um die Summe für X-und Y-Komponente vor der Zusammenlegung. Aber das ist nicht das, was ich will. Was ich will ist eine einzelne Abfrage/Methode, die nicht den job
- würde nicht zwei Summen arbeiten? So etwas wie ptlist.Summe(p => p.X); und ptlist.Summe(p => p.Y);
- "wie man den Durchschnitt mit LINQ?"..Ich denke du meinst die Summe
- es kann funktionieren, aber ich will alles in einer Abfrage, das ist es eben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
Aggregate
- Funktion in handliches kommen hier.Nur versichern, dass Sie die
/
- operator definiert für ArtenPointD
undint
, und dies sollte den job tun.Hinweis: ich bin mir nicht ganz sicher, ob Sie die Summe oder der Durchschnitt der hier (deine Frage ist etwas zweideutig über diese), aber ich habe Beispiele für beides.
struct
(alsPoint
Art in WPF/System.Zeichnung) ist, aber es scheint, er definiert es als eine Klasse. @Ngu Bald Hui: ich empfehle, Sie definieren IhrePointD
Typ alsstruct
, es sei denn, Sie haben guten Grund, sonst.Aggregate
danndefault(PointD)
als die Samen, welche die Dinge funktionieren.Benötigen Sie die
Aggregate
- Methode statt, so dass Sie können Ihre eigene aggregation-Funktion (Sum
ist nur eine bequeme Spezialfall dieser Methode). So etwas wie:Ich weiß, Sie sagen, Sie wollen nicht zusätzliche Methoden definiert, aber wenn dies ist eine gemeinsame operation, wäre ich geneigt zu schreiben, eine Erweiterung Methode für diese, D. H.
Weil es viel lesbarer schreiben zu können:
PointD
, es gibt keine Notwendigkeit, neu zu definieren, hinaus.new PointD(0, 0),
?