1

私はlinqを学び、mvcのコントローラーからjsonの結果を生成するのに数日を費やしました。ただし、現在、Y軸データの合計(累積合計)値をローリングして年初来の折れ線グラフを作成したいという問題に悩まされています。

簡単な月次データを生成するための現在の私のコードは次のとおりです。

//Generic Json For Graphs
public JsonResult GetJSONYTD(int kpiID)
{
    var ViewData = 
        (from kpidata in departmentrepo.GetGraphData(kpiID)
         select new DepartmentOverviewDetailsViewModel.GraphJSONViewModel
         {
             XData = kpidata.Year.Year1 + "-" 
                     + kpidata.Month.Real_Month_Int + "-01",
             YData = kpidata.Value
         });

    var ChartData = ViewData.Select(
                        x => new object[] { x.XData, x.YData }).ToArray();

    return Json(ChartData, JsonRequestBehavior.AllowGet);
}

上記により、次の配列が生成されます。

[
 ["2011-10-01",0],
 ["2011-11-01",22],
 ["2011-12-01",22],
 ["2012-1-01",14],
 ["2012-2-01",14.4],
 ["2012-3-01",17.5],
 ["2012-4-01",20.3],
 ["2012-5-01",23.5],
 ["2012-6-01",24.5],
 ["2012-7-01",26.5]
]

出力したい:

[
 ["2011-10-01",0],
 ["2011-11-01",22],
 ["2011-12-01",44],
 ["2012-1-01",38],
 ["2012-2-01",52.4],
 etc
]

何か助けはありますか?

4

2 に答える 2

0

コードを次のように変更します。

//グラフ用のジェネリック Json

public JsonResult GetJSONYTD(int kpiID)
{
    var graphData = departmentrepo.GetGraphData(kpiID);
    var ViewData = (from kpidata in graphData

                    select new DepartmentOverviewDetailsViewModel.GraphJSONViewModel
                    {
                        XData = kpidata.Year.Year1 + "-" + kpidata.Month.Real_Month_Int + "-01",
                        YData = graphData.Where(x=>x.Date<=kpidata.Date).Sum(x=>x.Value)
                    });

    var ChartData = ViewData.Select(x => new object[] { x.XData, x.YData }).ToArray();

    return Json(ChartData, JsonRequestBehavior.AllowGet);
}

上記のコードは、現在の日付以下のデータを持つすべてのデータ ポイントの合計を YData に格納します。

于 2012-09-07T23:21:21.670 に答える
0

Aggregate を使用してインラインでこれを行うことができます。

    var rollingSum = ViewData.Aggregate(
        // start with a list of a single model with value 0 (this avoids func having to deal with the empty list case
        seed: new[] { new DepartmentOverviewDetailsViewModel.GraphJSONViewModel { XData = string.Empty, YData = 0.0 } }.ToList(),
        // the aggregation function adds to the list a new tuple with the current date string
        // and a cumulative sum value
        func: (list, data) => {
            list.Add(new DepartmentOverviewDetailsViewModel.GraphJSONViewModel { XData = data.XData, YData = data.YData + list[list.Count - 1].YData });
            return list;
        }
    )
    .Skip(1) // skip the first dummy value we seeded the list with
    .ToArray();

別のオプションは、汎用の累積合計関数を作成してから使用することです。

public static class MyEnumerableExtensions {

    public static IEnumerable<double> CumulativeSum(this IEnumerable<double> @this) {
        var sum = 0;
        foreach (var value in @this) { sum += value; yield return sum; }
    }

}

// then to compute the sum you want
var rollingSum = ViewData.Select(m => m.YData).CumulativeSum();
var rollingSumWithDates = ViewData.Zip(rollingSum, (m, sum) => new DepartmentOverviewDetailsViewModel.GraphJSONViewModel { XData = m.XData, YData = sum })
    .ToArray();
于 2012-09-08T21:13:55.973 に答える