取出List集合中每条记录的指定值

前言

在做小东西的时候,需求一个功能:根据指定月份去查询数据库记录,并要取出每条记录中的指定值。最初一想,艾玛,感觉好麻烦啊,整么弄啊,不行吧,百度吧,百度好麻烦啊,不行了不行了。后来仔细分析分析,从数据库取出记录,不难啊,返回的是list集合,那么就要从list集合中取出值,感觉…不难!才怪。list集合里面有很多条记录,整么办呢??先取出每一条记录吧,可是不知道具体整么操作啊!对了,不是有api文档吗,查找list功能,找啊找,找啊找,找到外婆的澎湖湾,诶…找到了,list里面有个get(int index):从集合中返回指定位置的元素,哈哈哈哈这不就是吗,每一条记录取出来了,剩下的就是取出指定值,不说了,直接看代码吧。

代码呈现

/**
     * 功能:根据月份在数据库中查找记录
     * return:Json
     * */
    @ResponseBody
    @RequestMapping(value = "/getNGReport/{ngMonth}",produces = "text/html;charset=UTF-8",method = RequestMethod.GET)
    public String getNGReport(@PathVariable("ngMonth")String ngMonth,Map<Object,Object>map)
<think>我们有一个List集合,需要每次从中取出5000条数据进行处理,直到处理完所有数据。 在.NET中,我们可以使用循环和Skip()、Take()方法来实现分批获取。 步骤: 1. 确定总数据条数。 2. 计算需要分多少批(总条数除以每批条数,如果有余数,则批次数加1)。 3. 使用for循环,从0到批次数-1进行迭代。 4. 在每一批中,使用Skip(i * batchSize)跳过前面已经取过的数据,然后Take(batchSize)取当前批次的数据。 注意:Skip和Take是LINQ中的方法,适用于任何IEnumerable<T>,但要注意,对于非IQueryable的情况(如List),Skip和Take是在内存中操作的,所以如果数据量特别大,要确保内存足够。 另一种方法是使用GetRange(仅适用于List<T>),但需要计算每次的起始索引和取的数量,注意最后一批可能不足5000条。 这里我们使用Skip和Take,因为它更通用。 示例代码: 假设我们有一个List<T> data,我们想每次取5000条,然后对每批进行处理。</think>在.NET中,分批处理List集合数据可通过以下方法实现: ### 方法1:使用LINQ的`Skip()`和`Take()` ```csharp List<object> dataList = GetData(); // 原始数据集合 const int batchSize = 5000; // 每批数量 int totalCount = dataList.Count; for (int i = 0; i < totalCount; i += batchSize) { // 分批获取数据 var batch = dataList.Skip(i).Take(batchSize).ToList(); // 处理当前批次 ProcessBatch(batch); } ``` ### 方法2:使用`GetRange()`(仅适用于List<T>) ```csharp int currentIndex = 0; while (currentIndex < dataList.Count) { int remaining = dataList.Count - currentIndex; int takeCount = Math.Min(remaining, batchSize); // 直接获取子集合 var batch = dataList.GetRange(currentIndex, takeCount); // 处理当前批次 ProcessBatch(batch); currentIndex += takeCount; } ``` ### 性能说明 1. **内存效率**: - `Skip/Take`会创建新迭代器,适合大集合 - `GetRange`直接返回List引用,但会创建新集合对象[^1] 2. **处理建议**: - 每批处理完成后及时释放资源 - 考虑使用`Parallel.ForEach`并行处理(线程安全时) 3. **应用场景**: - 大数据导出/导入 - 批量数据库操作 - 分页处理[^2] ### 示例流程 ```mermaid graph LR A[开始] --> B[初始化索引=0] B --> C{索引 < 总数?} C -->|是| D[计算本次数量] D --> E[获取批次数据] E --> F[处理数据] F --> G[索引增加批次大小] G --> C C -->|否| H[结束] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值