2

モジュラー方式でアイテムを合計するのに問題があります。

私はこのクラスを持っています:

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を初めてGroupBy使用しますが、linqを試して使用し始めましたが、取得して応答したときに行き詰まりreportList.GroupBy(x => x.Type);、構造が何であるかのように、どうすればよいかわかりませんでしたか? どのように繰り返すのですか?

4

2 に答える 2

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];

各タイプのレポートが少なくとも 1 つ必要な場合は、これで問題ありません。特定のタイプのレポートがない可能性がある場合は、最初に次のように確認する必要があります。

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);
于 2013-07-21T13:21:28.597 に答える
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);
于 2013-07-21T13:23:09.477 に答える