List分组迭代器
说明:
针对长度较大的List对象,可以分组批量进行处理, 如:长度为1000的List对象,可分为10组,每组100条,对数据进行业务逻辑处理...
Source
/******************************************************************************
* 名称:List分组迭代器
* 说明:针对长度较大的List对象,可以分组批量进行处理
* 如:长度为1000的List<int>对象,可分为10组,每组100条,对数据进行业务逻辑处理
* 作者:Sybs
* 时间:2018-10-15
* **************************************************************************/
namespace System.Collections.Generic
{
/// <summary>
/// List分组迭代器
/// </summary>
public class ListGroupIterator<T>
{
private int _groupsize = 1;
/// <summary>
/// 分组大小(缺省值为1)
/// </summary>
public int GroupSize
{
get => _groupsize;
set => _groupsize = value < 1 ? 1 : value;
}
/// <summary>
/// 分组数量
/// </summary>
public int GroupCount { get => (Source.Count + GroupSize - 1) / GroupSize; }
/// <summary>
/// List数据源
/// </summary>
public List<T> Source { get; set; }
public ListGroupIterator() { }
public ListGroupIterator(int groupSize) : this(groupSize, null) { }
public ListGroupIterator(List<T> list) : this(1, list) { }
public ListGroupIterator(int groupSize, List<T> list)
{
this.GroupSize = groupSize;
this.Source = list;
}
/// <summary>
/// ListGroupIterator迭代器
/// </summary>
/// <returns></returns>
public IEnumerator<List<T>> GetEnumerator()
{
if (Source?.Count > 0)
{
var ps = Convert.ToInt32(Math.Ceiling(Source.Count * 1.0d / GroupSize));
var model = Source.Count % GroupSize;
for (int i = 0; i < ps; i++)
{
var len = ps - i == 1 && model > 0 ? model : GroupSize;
yield return Source.GetRange(GroupSize * i, len);
}
}
}
/// <summary>
/// 将List<T>实例赋值给ListGroupIterator对象
/// </summary>
/// <param name="list"></param>
public static implicit operator ListGroupIterator<T>(List<T> list)
{
return new ListGroupIterator<T> { Source = list };
}
}
}
调用
using System;
using System.Collections.Generic;
namespace Demo
{
class Program
{
static void Main()
{
ListGroupIterator<int> lg1 = new List<int>() { 1, 2, 3, 4, 5 };
ListGroupIterator<int> lg2 = new ListGroupIterator<int>(new List<int> { 1, 2, 3, 4, 5 });
ListGroupIterator<int> lg3 = new ListGroupIterator<int>(3, new List<int>() { 1, 2, 3, 4, 5 });
lg3.Source.AddRange(new List<int>() { 6, 7, 8, 9 });
lg3.GroupSize = 2;
foreach (var item in lg3) { Console.WriteLine(string.Join(",", item)); }
Console.ReadLine();
}
}
}
List分组迭代器的更多相关文章
- List分组迭代器 C#--深入理解类型
List分组迭代器 说明: 针对长度较大的List对象,可以分组批量进行处理, 如:长度为1000的List对象,可分为10组,每组100条,对数据进行业务逻辑处理... Source /**** ...
- Java Style的C++容器流式处理类
很久没有上博客园了,最近一段时间,因为工作的关系时间上比较闲,利用闲暇时间重新翻了一下丢弃很久的C++语言.C++从98.11.14.17目前已经也走到了20版本,发生了很多变化,也引入了很多新的语言 ...
- Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化
本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...
- Hadoop Mapreduce分区、分组、二次排序过程详解[转]
原文地址:Hadoop Mapreduce分区.分组.二次排序过程详解[转]作者: 徐海蛟 教学用途 1.MapReduce中数据流动 (1)最简单的过程: map - reduce (2) ...
- 5.python(迭代器,装饰器,生成器,基本算法,正则)
一,迭代器 1.迭代器 (1)迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束.迭代器只能往前不会后退. (2)对于原生支持随机访问的数据结构(如t ...
- 【Java】List集合按数量分组
有时候,我们需要将大的集合按指定的数量分割成若干个小集合.(比如:集合作为SQL中IN的参数,而SQL又有长度限制,所以需要分批分几次进行查询) 虽然此需求感觉不常见,但偶也写过几次类似的方法,故记录 ...
- Python标准库:迭代器Itertools
Infinite Iterators: Iterator Arguments Results Example count() start, [step] start, start+step, star ...
- Python学习笔记 (4) :迭代器、生成器、装饰器、递归、正则表达式等
迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大优点是 ...
- Python学习之路——迭代器、生成器、算法基础、正则
一.迭代器: 迭代器是访问集合元素的一种方式. 迭代器对象是从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. 另外,迭代 ...
随机推荐
- flutter photo_view的改造
app中对图片的浏览.缩放是一个常用的功能,目前有一款插件photo_view,基本上可以满足这些功能,但是有些地方需要修改完善 1.双击放大的时候,有三个状态,会有一个放大的中间状态,需要点击三次才 ...
- shell 中可以for 循环的时间加减日期格式
..};do # LAST_HOUR=`date -d '-${num} hour' +%H` 不可for循环,报格式错误 LAST_HOUR=`date "+%H" -d -${ ...
- LeetCode之字符串处理题java
344. Reverse String Write a function that takes a string as input and returns the string reversed. E ...
- UV-Sprite动画
[UV-Sprite动画] 下文以单行Sprite纹理作为动画贴图.首先需要输入纹理宽度.Sprint数量.速度: 计算每个Sprite的像素宽与UV宽: 根据_Time,计算当前显示第几个Sprit ...
- python's unittest
[python's unittest] unittest supports some important concepts: 从上图可以看到,unittest中的test-case.test-suit ...
- Excel VBA 获取按钮对象
今天给同事写了两个VBA宏,并分别把宏赋给了两个按钮. 因为两个宏都是实现在两种显示方式之间切换,于是我想除了功能的实现外,还希望在切换到其中一种方式时,按钮上面的文字也可以跟着改变,起到提示作用. ...
- Opencv 发现轮廓 findContours
vector<vector<Point>> vec_p; vector<Vec4i> vec_4f; findContours(img_canny1, vec_p, ...
- Red Hat Cluster Suite 组件 fencing FAQ
说明 Red Hat Cluster实现HA的关键组件之一是fencing.没有设置fencing,虽然看上去也能够运行Cluster,但是一旦遇到故障切换就会出现异 常,所以深入理解fencing原 ...
- poi导出excel表格
package poiexcel; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; ...
- LoadRunner11学习记录六 -- 服务器分析
LoadRunner运行时,怎么利用服务器的一些参数进行分析: 1.内存分析方法 内存分析方法主要是用于判断系统有无遇到内存瓶颈,是否需要通过增加内存等手段提高系统性能表现.主要计数器包括Memory ...