2010-06-05 15 views
14

Ich habe eine Klasse und eine Liste wie folgt:Linq und bedingte Summe

class C1 
{ 
    int RecType ...; 
    decimal Income ...; 
    decimal Outcome ...; 
} 

List<C1> myList ...; 

Die Liste wird mit mehreren Datensätzen geladen, und sie haben verschiedene Werte in RecType Was ich will, ist insgesamt auf Einkommen zu berechnen und Ergebnis aber nur für einen bestimmten Wert von RecType

Hier ist ein Pseudo-Code von dem, was ich brauche

totalIncome = myList.Sum(Income).Where(RecType==1); 

Wie kann ich dies mit Linq erreichen zu bekommen?

Danke

Antwort

20
totalIncome = myList.Where(x => x.RecType == 1).Select(x => x.Income).Sum(); 

Zuerst auf dem Aufzeichnungstyp filtern (Where); dann transformieren Sie durch Select in der Income jedes Objekts; und schließlich Sie Sum alles auf.

Oder eine etwas lapidaren Version:

totalIncome = myList.Where(x => x.RecType == 1).Sum(x => x.Income); 
24
totalIncome = myList.Sum(c=> 
    (c.RecType==1 ? c.Income : 0));
+0

ich meinen Code glauben 15-20% schneller als @ Mark sein wird ... – code4life

+0

Thanks a lot, das schien der einzige zu sein, fix für mich, um die Summe einer nullwertfähigen Dezimalzahl zu erhalten. – user1534664

+0

Das ist großartig! Funktioniert mit linq zu Entitäten und löst sogar das Problem, wenn die Liste leer ist. –