我刚刚起步的编程技巧已经触底了。我可以让这个工作,但代码很臭,我相信必须有一个更有效的方式,我还不知道它。
我有一个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个数据点。代码越来越长,越来越重复。
但是,问题是,我怎样才能“将所有四个数组中的值”累加并压缩“成一个数组呢?
答案 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初始值设定项中添加新行。