list与字典的高级用法之合并数据

本文探讨了一种数据结构优化方案,旨在减少对数据库的多次请求,通过使用字典和列表来合并相同ID的数据记录,从而提高系统性能。文章详细介绍了两种实现方式,包括多次请求数据库的传统方法和优化后的单次请求方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、业务需求

list中存放的数据结构:
id姓名期数截图地址
01张三14期Picture01
01张三14期Picture02
01张三14期Picture03
02李四14期Picture04
02李四14期Picture05
03王二麻子14期Picture06
03王 二麻子14期Picture07
要将上述的数据存储结构转成下面的数据结构
id姓名期数截图地址
01张三14期Picture01 Picture02 Picture03
02李四14期Picture04 Picture05
03王二麻子14期Picture06 Picture07
实现方式一:多次请求数据库完成

实现思路: 第一次查询出 id 期数 姓名,然后根据`id查询出对应的截图地址,此过程需要遍历,然后将所有的截图信息存入到list中,最后的结构就是下图:

id姓名期数截图地址
01张三14期list
02李四14期list
03王二麻子14期list

对应的部分代码,不全,但是核心的思想通过注释都显示出来了,不明白可以私聊我


 List<ContractInfoDTO> cd = contract.GetAllContracInformationByDifferentParameter(page, limit, userName, organizaName);   
 //此时cd里面存的是所有没有经过合并的数据
            for (int i = 0; i < cd.Count; i++)
            {
                cd[i].PictureUrl = new List<string>();
                
                List<ScreenDTO> listScreen = contract.getScreenPictureByidAndYear(cd[i].Id, cd[i].Contract_Year.ToString());
                //listScreen存的是根据年份和id查找的截图,每个id和截图都对应多条记录
                
                for (int j = 0; j < listScreen.Count; j++)
               //这个for循环将所有的相对应的截图存放到PictureUrl,这是一个list
                {
                    cd[i].PictureUrl.Add(listScreen[j].Contract_Url);           
                }
            }
            return cd;

ContractInfoDTO里面的代码:

   public List<string> PictureUrl { get; set; }
   public string user_name { get; set; }
   public string Id { get; set; }
   public string organization { get; set; }

swagger中显示的pictureurl
在这里插入图片描述
上述有缺点,因为多次请求数据库,这样十分不好,也是李总要求优化的地方 ,下面的方式二就是优化后的

实现方式二 只请求一次数据库

实现思路:第一次查询出了未经过合并的所有的数据,对现在的数据进行操作, 利用字典, 循环遍历list,然后判断如果有重复的id,就对截图地址进行拼接, 采用的方式是使用字典,如下代码:

  List<ContractInfoDTO> list = contract.GetAllContracInformationByDifferentParameter(page, limit, userName, organizaName);
            //此时list里面存的是所有没有经过合并的数据


            List<ContractInfoDTO> listLog = new List<ContractInfoDTO>();
            Dictionary<string, string> dic = new Dictionary<string, string>();
            //遍历list
            list.ForEach(res =>
            {
            	//如果一开始字典中没有数据,或者没有重复的id,就在listLog增加相应的记录
                if (dic.Count==0?true:!dic.ContainsKey(res.Id))
                {
                    dic.Add(res.Id, res.sc_contract_copy_url);
                    listLog.Add(res);
                }
                else
                {
                    dic[res.Id] = dic[res.Id] + "," + res.sc_contract_copy_url;
                    listLog.FirstOrDefault(x => x.Id == res.Id).sc_contract_copy_url = dic[res.Id];
                }
            });
            return listLog;

下图是swagger中的数据,此时在前端通过截取就可以获得单个截图地址了
在这里插入图片描述

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值