将多个数组中的数据值累加并压缩到单个数组中

本文关键字:数组 压缩 单个 数据 | 更新日期: 2023-09-27 18:32:19

我刚刚起步的编程技能碰壁了。我可以让它工作,但代码很臭,我相信一定有一种更有效的方法,我只是还不知道。

我有一个接受数据属性名称作为参数的 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 个数据点。代码越来越长,越来越重复。

但是,问题是,我还能如何将所有四个数组的值"汇总和压缩"到一个数组中?

将多个数组中的数据值累加并压缩到单个数组中

首先,我建议不要使用像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 初始值设定项添加新行。