C# 通用DataTable 拆分小表

一个简单的使用遍历的方式进行DataTable 的拆分

 private static List<DataTable> DataTableSplite(DataTable dt, int modcounts)
        {
            List<DataTable> list = new List<DataTable>();

            int counts = dt.Rows.Count / modcounts;  ///  取整数个数

            int mod = dt.Rows.Count % modcounts;    ///  余数

            if (mod > 0)
            {
                int index = 0;
                ///  处理拆分倍数的部分
                for (int i = 0; i < counts; i++)
                {

                    DataTable dt1 = dt.Clone();
                    dt1.TableName = "count" + i;
                    for (int j = index * modcounts; j < (index + 1) * modcounts; j++)
                    {

                        DataRow newrow = dt.NewRow();
                        DataRow row1 = dt.Rows[j];
                        newrow["name"] = row1["name"];
                        newrow["age"] = row1["age"];
                        dt1.Rows.Add(newrow.ItemArray);
                    }
                    index++;
                    list.Add(dt1);
                }

                ///  处理余数部分的组合
                DataTable dt2 = dt.Clone();
                dt2.TableName = "modetable";
                for (int i = counts * modcounts; i < dt.Rows.Count; i++)
                {
                    DataRow newrow = dt.NewRow();
                    DataRow row1 = dt.Rows[i];
                    newrow["name"] = row1["name"];
                    newrow["age"] = row1["age"];
                    dt2.Rows.Add(newrow.ItemArray);
                }
                list.Add(dt2);

            }
            else
            {
                ///   余数为0 的情况处理
                int index = 0;
                for (int i = 0; i < counts; i++)
                {

                    DataTable dt1 = dt.Clone();
                    dt1.TableName = "modetable";
                    for (int j = index * modcounts; j < (index + 1) * modcounts; j++)
                    {

                        DataRow newrow = dt.NewRow();
                        DataRow row1 = dt.Rows[j];
                        newrow["name"] = row1["name"];
                        newrow["age"] = row1["age"];
                        dt1.Rows.Add(newrow.ItemArray);
                    }
                    index++;
                    list.Add(dt1);
                }
            }

            return list;
        }

实现的方式比较简单,同时也可以使用linq 的方式进行

代码如下:

private static List<DataTable> DataTableSplite2(DataTable dt, int modcounts)
        {

            int counts = dt.Rows.Count / modcounts;  ///  取整数个数

            List<DataTable> list = new List<DataTable>();                                     ///  

            int index = 0;
            for (int i = 0; i < counts + 1; i++)
            {
                list.Add(dt.AsEnumerable().Skip(index * modcounts).Take(modcounts).CopyToDataTable());

                index++;
            }
            return list;

        }

代码更少。

时间: 2024-10-19 10:34:36

C# 通用DataTable 拆分小表的相关文章

hive join 优化 --小表join大表

1.小.大表 join 在小表和大表进行join时,将小表放在前边,效率会高,hive会将小表进行缓存. 2.mapjoin 使用mapjoin将小表放入内存,在map端和大表逐一匹配,从而省去reduce. 例子: select /*+MAPJOIN(b)*/ a.a1,a.a2,b.b2 from tablea a JOIN tableb b ON a.a1=b.b1 在0.7版本后,也可以用配置来自动优化 set hive.auto.convert.join=true;

对datatable里面的表进行排序

一.重生法dstaset.Tables.Add(dt)dataset.Tables(0).DefaultView.Sort = "id desc"--------------------------------------------------------------------------------二.直接法dv = New DataView(dt)dv.Sort = "id desc"-------------------------------------

查询优化--小表驱动大表(In,Exists区别)

Mysql 系列文章主页 =============== 本文将以真实例子来讲解小表驱动大表(In,Exists区别) 1 准备数据 1.1 创建表.函数.存储过程 参照  这篇(调用函数和存储过程批量插入数据)  文章中的第 1-7 步,注意,不要执行第8步 1.2 插入数据 现在来执行第8步. 1.2.1 向 Department 表中插入 100 条记录 CALL insert_dept(1000, 100) 1.2.2 向 Employee 表中插入 100000 条记录 CALL in

Mysql优化原则_小表驱动大表IN和EXISTS的合理利用

//假设一个for循环for($i = 0; $i < 10000; $i++) { for ($j = 0; $i < 50; $j++) { }} for($i = 0; $i < 50; $i++) { for ($j = 0; $i < 10000; $j++) { }} 看以上两个for循环,总共循环的次数是一样的.但是对于mysql数据库而言,并不是这样了,我们尽量选择第②个for循环,也就是小表驱动大表.数据库最伤神的就是跟程序链接释放,第一个建立了10000次链接,

3YAdmin-专注通用权限控制与表单的后台管理系统模板

3YAdmin基于React+Antd构建.GitHub搜索React+Antd+Admin出来的结果没有上百也有几十个,为什么还要写这个东西呢? 一个后台管理系统的核心我认为应该是权限控制,表单以及错误信息收集这三大块,前两个最为重要.而GitHub上的大多数项目关注点都不在这里,各种第三方组件堆砌在一起,看起来很炫酷,但是实用性没多大,改起来也麻烦(如果是vue,可以看我的另一个项目vue-quasar-admin). 有人可能会有疑问:权限控制,不同系统实现不一样,根本没法做到通用.权限控

【Spark调优】小表join大表数据倾斜解决方案

[使用场景] 对RDD使用join类操作,或者是在Spark SQL中使用join语句时,而且join操作中的一个RDD或表的数据量比较小(例如几百MB或者1~2GB),比较适用此方案.. [解决方案] 小表join大表转为小表broadcast+map大表实现.具体为: 普通的join是会shuffle的,而一旦shuffle,就相当于会将相同key的数据拉取到一个shuffle read task中再进行join,此时就是reduce join,此时如果发生数据倾斜,影响处理性能,而此时恰好

hive大表和小表MapJoin关联查询优化

大表和小表关联查询可以采用mapjoin优化查询速度.那什么是mapjoin呢?理解MapJoin之前先介绍另一种Join方式,CommonJoin.我们知道Hive编写SQL语句,Hive会将SQL解析成MapReduce任务.对于一个简单的关联查询,CommonJoin任务设计Map阶段和Reduce阶段.Mapper 从连接表中读取数据并将连接的 key 和连接的 value 键值对输出到中间文件中.Hadoop 在所谓的 shuffle 阶段对这些键值对进行排序和合并.Reducer 将

Mysql Join大表小表到底谁驱动谁

1.准备 mysql> create table dept( id int unsigned auto_increment not null primary key, name varchar(20) default '' not null, key(name) )engine=innodb default charset=utf8mb4; CREATE TABLE `userinfo` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(255

sql 拆分为小表

alter table [Table] add id int identity(1,1) go declare @i int declare @sql varchar(1000) set @i=0 while @i<=39 begin set @sql='select * into [TB'+ltrim(i)+'] from [Table] where id between @i*50000+1 and (@i+1)*50000' exec(@sql) set @[email protected