更好的总结方式
本文关键字:方式 更好 | 更新日期: 2023-09-27 18:24:02
我在以模块化方式求和项目时遇到问题。
我有这个班:
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);
时,我被卡住了,不知道该怎么处理它,比如在什么结构中?我该如何迭代它?
这是您想要的查询:
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);
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);