将多个数组中的数据值累加并压缩到单个数组中
本文关键字:数组 压缩 单个 数据 | 更新日期: 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 初始值设定项添加新行。