2010-12-04 9 views
91

Ich habe eine Liste von Objekten. Eine Eigenschaft des einzelnen Objekteintrags ist Betrag. Wie bekomme ich die Summe des Betrags?C# Liste der Objekte, wie bekomme ich die Summe einer Eigenschaft

Wenn meine Liste des Typs ist doppelt ich in der Lage sein, so etwas zu tun:

double total = myList.Sum(); 

jedoch zu etwas, was ich möchte dies ähnlich zu, aber diese Syntax ist falsch.

double total = myList.amount.Sum(); 

Wie soll ich das erreichen? Ich würde gerne die Sum-Funktion verwenden, wenn möglich, anstatt den Wert zu durchlaufen und zu berechnen.

Antwort

181
using System.Linq; 

...

double total = myList.Sum(item => item.Amount); 
+8

Ist dies schneller als foreach aus Interesse? – Coops

+3

Ich bin auch an @ CodeBlend's Frage interessiert. Ist diese Berechnung schneller als eine for-Schleife? – rex

+4

Stellen Sie sicher, dass Sie eine using-Anweisung für System.Linq verwenden. – ADH

26

Und wenn Sie es auf Elemente zu tun, die eine bestimmte Bedingung erfüllen ...

double total = myList.Where(item => item.Name == "Eggs").Sum(item => item.Amount); 
-2

Hier Beispielcode ist Sie zu machen laufen könnte ein solcher Test:

var f = 10000000; 
var p = new int[f]; 

for(int i = 0; i < f; ++i) 
{ 
    p[i] = i % 2; 
} 

var time = DateTime.Now; 
p.Sum(); 
Console.WriteLine(DateTime.Now - time); 

int x = 0; 
time = DateTime.Now; 
foreach(var item in p){ 
    x += item; 
} 
Console.WriteLine(DateTime.Now - time); 

x = 0; 
time = DateTime.Now; 
for(int i = 0, j = f; i < j; ++i){ 
    x += p[i]; 
} 
Console.WriteLine(DateTime.Now - time); 

Das gleiche Beispiel fo r komplexes Objekt ist:

void Main() 
{ 
    var f = 10000000; 
    var p = new Test[f]; 

    for(int i = 0; i < f; ++i) 
    { 
     p[i] = new Test(); 
     p[i].Property = i % 2; 
    } 

    var time = DateTime.Now; 
    p.Sum(k => k.Property); 
    Console.WriteLine(DateTime.Now - time); 

    int x = 0; 
    time = DateTime.Now; 
    foreach(var item in p){ 
     x += item.Property; 
    } 
    Console.WriteLine(DateTime.Now - time); 

    x = 0; 
    time = DateTime.Now; 
    for(int i = 0, j = f; i < j; ++i){ 
     x += p[i].Property; 
    } 
    Console.WriteLine(DateTime.Now - time); 
} 

class Test 
{ 
    public int Property { get; set; } 
} 

Meine Ergebnisse mit Compiler-Optimierungen ausgeschaltet sind:

00:00:00.0570370 : Sum() 
00:00:00.0250180 : Foreach() 
00:00:00.0430272 : For(...) 

und für die zweiten Test sind:

00:00:00.1450955 : Sum() 
00:00:00.0650430 : Foreach() 
00:00:00.0690510 : For() 

es wie LINQ aussieht, ist im Allgemeinen langsamer als foreach (...) aber was für mich seltsam ist, ist, dass foreach (...) schneller zu sein scheint als for loop.

+1

für zukünftige Referenz, schauen Sie sich 'Stoppuhr' in' System.Diagnostics' an, da es sich um einen Hochleistungs-Zeitregistrator handelt. (Ich habe Sie übrigens nicht runter gelinkt) –

+1

Verwenden Sie 'DateTime.Now' nicht zum Messen. Es hat eine schreckliche Leistung, da es immer lokale Zeit zurückgibt. 'DateTime.UtcNow' ist schneller; Es verwendet jedoch immer noch nicht so hohe Auflösung wie die Klasse "Stoppuhr". – taffer

+2

Dies beantwortet die Frage nicht. –

4

Eine weitere Alternative:

myPlanetsList.Select(i => i.Moons).Sum(); 
+1

Anstelle von '' '.Wählen Sie (i => i.Moons) .Sum()' '' Sie können '' '.Sum (i => i.Moons)' '' – Mason

+1

@Mason, richtig und das ist Wie Alex in seiner früheren Antwort auf das Problem einging, also habe ich einfach eine andere Möglichkeit gegeben, dasselbe zu tun. – usefulBee

+1

Ah ja, Entschuldigung für mein Missverständnis. – Mason

Verwandte Themen