欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

List分组迭代器

程序员文章站 2022-07-02 15:20:00
说明: 针对长度较大的List对象,可以分组批量进行处理, 如:长度为1000的List对象,可分为10组,每组100条,对数据进行业务逻辑处理... Source 调用 ......

说明:

针对长度较大的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>
        /// 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();
        }
    }
}