2013-07-21 55 views
3

我有問題以模塊化的方式總結項目。更好的方法來總結

我有這個類:根據這個數字

public enum ReportType 
{ 
    Worker, 
    Management, 
    Guest 
} 

public class Report 
{ 
    public ReportType Type { get; set; } 
    public int Lost { get; set; } 

    public Report(ReportType typ, int los) 
    { 
    Type = typ; 
    Lost = los; 
    } 
} 

而得到的Report清單,並應找出與最大的損失返回Report列表的方法,再加上一些計算。 我開始的方法:

public class ReportsManager 
{ 
    public static List<Report> CalculateBiggerLost(List<Report> reportList) 
    { 
    int WorkerSum = 0; 
    int ManagementSum = 0; 
    int GuestSum = 0; 

    foreach (Report report in reportList) 
    { 
     switch (report.Type) 
     { 
       case ReportType.Guest: 
       { 
       GuestSum += report.Lost; 
       break; 
       } 
       case ReportType.Management: 
       { 
       ManagementSum += report.Lost; 
       break; 
       } 
       case ReportType.Worker: 
       { 
       WorkerSum += report.Lost; 
       break; 
       } 
     } 
    } 

    if (GuestSum >= ManagementSum && GuestSum >= WorkerSum) 
    { 
     // Doing some report 
    } 
    else if (WorkerSum >= ManagementSum) 
    { 
     // inner Check 
    } 
    } 
} 

,但它不是在好的情況下,我會可能在ReportType枚舉另一個值,然後將不得不重寫代碼,再加上它不是那麼可讀。我是新來的linq,但我開始嘗試和使用LINQ GroupBy但卡住了,當我得到和回答reportList.GroupBy(x => x.Type);,並不知道該怎麼辦,如在什麼結構?我如何迭代它?

回答

11

這是查詢要:

var results = reportList.GroupBy(r => r.Type) 
         .ToDictionary(g => g.Key, g => g.Sum(r => r.Lost)); 
int WorkerSum = results[ReportType.Worker]; 
int ManagementSum = results[ReportType.Management]; 
int GuestSum = results[ReportType.Guest]; 

如果你希望讓每個類型的至少一個報告,這將正常工作。如果不存在一個給定類型的報告,這是可能的,你不得不檢查,首先,像這樣:

int WorkerSum = results.ContainsKey(ReportType.Worker) ? results[ReportType.Worker] : 0; 
int ManagementSum = results.ContainsKey(ReportType.Management) ? results[ReportType.Management] : 0; 
int GuestSum = results.ContainsKey(ReportType.Guest) ? results[ReportType.Guest] : 0; 

或者這樣:

int WorkerSum; 
int ManagementSum; 
int GuestSum; 
results.TryGetValue(ReportType.Worker, out WorkerSum); 
results.TryGetValue(ReportType.Management, out ManagementSum); 
results.TryGetValue(ReportType.Guest, out GuestSum); 
+1

+1 ..當時即將寫入相同。 –

+1

+1。我的方式更好。 – Ehsan

3
int guestSum = reportList.Where(x=>x.Type==ReportType.Guest).Sum(x=>x.Lost); 
int workerSum = reportList.Where(x=>x.Type==ReportType.Worker).Sum(x=>x.Lost); 
int managementSum = reportList.Where(x=>x.Type==ReportType.Manment).Sum(x=>x.Lost);