将来自多个阵列的数据值累加并压缩为单个阵列

时间:2014-11-27 14:13:55

标签: c# arrays loops

我刚刚起步的编程技巧已经触底了。我可以让这个工作,但代码很臭,我相信必须有一个更有效的方式,我还不知道它。

我有一个Web服务,它接受数据属性的名称作为参数。处理请求的部分方法是离开并为指定的数据属性获取大量数据。在我的情况下,它说去吧,让我得到当前年份的数据库中“用电量”属性的目标和实际值。

在我的代码中,这就像:

var data = rSvc.getDashboardPayload(worklocation, property, year);

然后将其作为JSON有效负载传递(剪切示例):

0:  {
month: 1
monthName: "Jan"
currentYearTarget: 100
currentYearActual: 90
}

但是,我们需要做出一个改变,我们需要生成一个图表,实际上只是数据库中的4个度量。例如:“危险废物”是指非金属废物的总量,加上金属废物的总量,加上焚烧废物的总量......等等。你得到了照片。

因此,在我的代码中,我可以获得每个度量的有效负载:

var shwl = rSvc.getDashboardPayload(worklocation, propName, year);
var shwi = rSvc.getDashboardPayload(worklocation, propName, year);
var shmwr = rSvc.getDashboardPayload(worklocation, propName, year);
var shnmwr = rSvc.getDashboardPayload(worklocation, propName, year);

然后我可以创建一个新列表作为我的输出:

var merged = new List<WLDChartsPayload>(12);

然后我可以循环工作12个月,然后依次累计每个指标。

for (short i = 1; i < 13; i++)
 {
   var m = new WLDChartsPayload();

   m.currentYearActual = shwl.Where(x => x.currentYearActual.HasValue && x.month == i).FirstOrDefault().currentYearActual;
   m.currentYearActual += shwi.Where(x => x.currentYearActual.HasValue && x.month == i).FirstOrDefault().currentYearActual;
   m.currentYearActual += shmwr.Where(x => x.currentYearActual.HasValue && x.month == i).FirstOrDefault().currentYearActual;
   m.currentYearActual += shnmwr.Where(x => x.currentYearActual.HasValue && x.month == i).FirstOrDefault().currentYearActual;

   m.currentYearTarget = shwl.Where(x => x.currentYearTarget.HasValue && x.month == i).FirstOrDefault().currentYearTarget;
   m.currentYearTarget += shwi.Where(x => x.currentYearTarget.HasValue && x.month == i).FirstOrDefault().currentYearTarget;
   m.currentYearTarget += shmwr.Where(x => x.currentYearTarget.HasValue && x.month == i).FirstOrDefault().currentYearTarget;
   m.currentYearTarget += shnmwr.Where(x => x.currentYearTarget.HasValue && x.month == i).FirstOrDefault().currentYearTarget;

   merged.Add(m);
 }

然后我返回合并列表。

但这只是错了。我在有效载荷中有10个数据点。代码越来越长,越来越重复。

但是,问题是,我怎样才能“将所有四个数组中的值”累加并压缩“成一个数组呢?

1 个答案:

答案 0 :(得分:1)

首先,我建议远离像shwl这样的名字。使用实际描述数据所包含内容的真实短语。 C#在其API中故意冗长,你应该效仿。

关于实际问题,很难按照您的要求进行操作,但您可以做一些明显的事情:

首先,您有几个列表,因此请将它们放入一个列表中:

var myLists = new List<WhatEverType>() 
                {
                   rSvc.getDashboardPayload(worklocation, propName, year),
                   rSvc.getDashboardPayload(worklocation, propName, year),
                   rSvc.getDashboardPayload(worklocation, propName, year),
                   rSvc.getDashboardPayload(worklocation, propName, year),
                };

现在您可以将它们作为一个组处理,因此您的循环体是:

for (short i = 1; i < 13; i++)
{
   var m = new WLDChartsPayload();
   m.currentYearActual = myLists.Sum(list =>item.FirstOrDefault(x => x.currentYearActual.HasValue && x.month == i).currentYearActual);
   m.currentYearTarget= myLists.Sum(list =>item.FirstOrDefault(x => x.currentYearTarget.HasValue && x.month == i).currentYearTarget);
   merged.Add(m);
}

如果Linq过于复杂,你可以将它展开到foreach循环中(用...替换for()循环体):

m.currentYearActual = m.currentYearTarget = 0;
foreach(var list in myLists)
{
   m.currentYearActual += itemlist.FirstOrDefault(x => x.currentYearActual.HasValue && x.month == i).currentYearActual);
   m.currentYearTarget += itemlist.FirstOrDefault(x => x.currentYearTarget .HasValue && x.month == i).currentYearTarget );
}
merged.Add(m);

我对原始代码的所有细节都不是很清楚 - 你没有提供足够的细节,所以我没有编译这些想法,但是,这些方面的内容将解决你的基本问题。添加更多列表可使代码保持相同,但只需在myLists初始值设定项中添加新行。