Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更好的计算方法_C#_Linq - Fatal编程技术网

C# 更好的计算方法

C# 更好的计算方法,c#,linq,C#,Linq,我在以模块化方式求和项目时遇到了问题 我有这门课: 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; Los

我在以模块化方式求和项目时遇到了问题

我有这门课:

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;
  }
}
以及一种获取
报告
列表的方法,该方法应查找并返回损失最大的
报告
列表,并根据该数字进行一些计算。 我开始了这个方法:

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
     }
  }
}
公共类报表管理器
{
公共静态列表CalculateBiggerLost(列表报告列表)
{
int-WorkerSum=0;
整数和=0;
int GuestSum=0;
foreach(报告列表中的报告)
{
开关(report.Type)
{
案例报告类型。来宾:
{
GuestSum+=报告。丢失;
打破
}
病例报告类型。管理:
{
ManagementSum+=报告丢失;
打破
}
案例报告类型。工作人员:
{
WorkerSum+=报告。丢失;
打破
}
}
}
if(GuestSum>=管理金额和GuestSum>=工人金额)
{
//做报告
}
否则如果(WorkerSum>=管理总额)
{
//内部检查
}
}
}

但如果我在
ReportType
enum中有另一个值,然后必须重写代码,加上它的可读性不太好,那就不太好了。我不熟悉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 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);