C#代码优化:提升实时数据处理效率
以下是优化后的代码:
public async Task<dynamic> ReceiveRealTimeDTONewAsync(ReceiveInput input)
{
var data = input.data.OrderBy(p => p.timestamp);
_logger.LogInformation('接收采集实时数据-input:' + input.ToJson());
// 根据SN去重,并获取SN,type,timestamp
var snList = data.OrderByDescending(p => p.timestamp).DistinctBy(x => x?.labels?.sn).Select(p => new { p?.labels?.sn, p?.labels?.type, p?.timestamp }).ToList();
foreach (var itemSn in snList) // 循环SN
{
if (itemSn?.sn == null || itemSn?.type == null)
{
continue;
}
var dataList = data.Where(itemData => itemData.labels != null && itemSn.sn == itemData.labels.sn && itemSn.type == itemData.labels.type)
.Select(itemData => new { Key = itemData.labels.field, Value = itemData.value })
.ToList();
if (dataList.Count > 0) // 只添加一次SN
{
dataList.Insert(0, new { Key = 'SN', Value = itemSn.sn });
}
var dt = new { Timestamp = itemSn.timestamp, DataList = dataList };
switch (itemSn.type) // 判断SN所属设备类型
{
case 'db': // 电表
await ReceiveElectricityMeterRealTimeDTONew(dt); // 插入电表数据
break;
case 'nbq':
await ReceiveInverterRealTimeDTONew(dt); // 插入逆变器数据
break;
case 'cn':
await ReceiveStoredEnergyRealTimeDTONew(dt); // 插入储能数据
break;
}
}
AjaxResult result = new()
{
ErrorCode = 0,
Success = true,
Msg = '成功!'
};
return result;
}
优化说明:
- 使用
Where方法代替内部循环和条件判断来筛选数据,提升代码可读性和性能。 - 使用
Select方法来构建dataList,避免了重复的if条件判断。 - 将
dataList的插入操作放在判断之后,避免了不必要的插入操作。 - 修复了
AjaxResult的实例化错误。
原文地址: https://www.cveoy.top/t/topic/pZmv 著作权归作者所有。请勿转载和采集!