以下是优化后的代码:

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的实例化错误。
C#代码优化:提升实时数据处理效率

原文地址: https://www.cveoy.top/t/topic/pZmv 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录