2016-03-30 4 views
2

Ich habe ein Objekt (Details), die Mitarbeiterdetails hat. Dieses Objekt hat Eigenschaften (sal und Level).
Ich möchte nur die Summe von sal für jeden einzelnen Level bekommen.So erhalten Sie die Summe der Werte dynamisch zu verschiedenen Variablen in C#

foreach (var emp in Details) 
{ 
    int empsal=emp.sal; 
    int empLevel= emp.Level; 
} 

Beispiel: Ich möchte die Summe aller Mitarbeiter Sal in verschiedenen Variablen basierend auf den Ebenen.

Antwort

2
var sumByLevels = Details.GroupBy(employee => employee.Level) 
        .ToDictionary(g => g.Key, g => g.Sum(x => x.sal)); 

nun annehmen, dass Sie Gesamtgehalt von Stufe 1 erhalten möchten:

var result = sumByLevels[1]; 
1

können Sie tun, dass LINQ GroupBy Methode:

Dictionary<int, int> sumsByLevel = 
    Details.GroupBy(employee => employee.Level, employee => employee.sal). 
    ToDictionary(group => group.Key, group => group.Sum()); 

Daraus ergibt sich ein Wörterbuch mit den Level s als Schlüssel und die Summe der entsprechenden sal s als Wert.

+0

@CuongLe Ich habe deinen Schnitt zurückgerollt, weil ich denke, dass er Schaden verursacht hat! 'group.Sum()' konnte nicht funktionieren, wenn 'group' eine Aufzählung von Mitarbeitern anstelle von int war. –

+0

Ok, dann sehe meine Antwort, das wollte ich ändern –

+0

@CuongLe Ich dachte schon, aber du hast das Lambda in der 'Sum' vergessen. Kein Problem, gebe dir +1. Ich frage mich, ob es einen Leistungsunterschied geben würde. –

0

Die erste Antwort ist gut. Zum Beispiel haben Sie Klasse:

public class Details 
{ 
    public int Level { get; set; } 
    public int Sal { get; set; } 
} 

und Sie haben Daten:

var data = new List<Details>() 
    { 
     new Details() {Level = 1, Sal = 1}, 
     new Details() {Level = 1, Sal = 1}, 
     new Details() {Level = 1, Sal = 1}, 
     new Details() {Level = 2, Sal = 2}, 
     new Details() {Level = 2, Sal = 2}, 
     new Details() {Level = 3, Sal = 3}, 
     new Details() {Level = 3, Sal = 3}, 
     new Details() {Level = 3, Sal = 3}, 
    }; 

wenn wir berechnen, erhalten wir:

  1. Ebene (1) = 3
  2. Ebene (2) = 4
  3. Füllstand (3) = 9

Lösung ein (gut):

var sum = data.GroupBy(x => x.Level).ToDictionary(x => x.Key, a => a.Sum(b => b.Sal)); 
    Console.WriteLine(sum[1]); // result 3 
    Console.WriteLine(sum[2]); // result 4 
    Console.WriteLine(sum[3]); // result 9 

Lösung zwei (nicht sehr gut):

public int GetSumOfLevel(int level, List<Details> details) 
{ 
    return details.Where(x => x.Level == level).Sum(x => x.Sal); 
} 

...

Console.WriteLine(GetSumOfLevel(1, data)); // result 3 
    Console.WriteLine(GetSumOfLevel(2, data)); // result 4 
    Console.WriteLine(GetSumOfLevel(3, data)); // result 9 

die erste Option wählen sein kann?

Verwandte Themen