c# datatable按主键合并相同主键返回新的datatable

一、概述:

在python转c#时,python中pandas.merge可以按主键合并两个datatable,苦苦找了很久,希望c#也有同样的函数,未果,就自己写了一个,目前测试没问题,同样我也考虑了效率和简洁的问题。

二、原理:

     (1)封装的函数如下:传入两个datatable和主键,返回一个datatable

private DataTable unite_on_datatable(DataTable dt1,DataTable dt2,string key)

(2)先将dt1和dt2按照主键排序,声明一个新的datatable叫dt3,dt3包含了所有的列名,然后dt1和dt2从上到下遍历一遍,将所有相同的主键的列全部加到dt3中

三、展示结果:

     

四、代码:

 1  private DataTable unite_on_datatable(DataTable dt1,DataTable dt2,string key)
 2         {
 3             DataTable dt3 = dt1.Clone();
 4             for(int i=0;i<dt2.Columns.Count;i++)
 5             {
 6                 if(dt2.Columns[i].ColumnName!=key)
 7                 {
 8                     dt3.Columns.Add(dt2.Columns[i].ColumnName);
 9                 }
10             }
11
12             //先排序
13             dt1 = sort_desc(dt1, key);
14             dt2 = sort_desc(dt2, key);
15
16             int count1 = 0,count2=0;
17             while(true)
18             {
19                 if (count1 >= (dt1.Rows.Count) || (count2 >= (dt2.Rows.Count)))
20                     return dt3;
21
22                 //找到
23                 while(string.Compare(dt1.Rows[count1][key].ToString(),dt2.Rows[count2][key].ToString())<0)
24                 {
25                     count1++;
26                     if (count1 >= dt1.Rows.Count)
27                         return dt3;
28                 }
29                 while (string.Compare(dt1.Rows[count1][key].ToString(), dt2.Rows[count2][key].ToString()) < 0)
30                 {
31                     count2++;
32                     if (count2 >= dt2.Rows.Count)
33                         return dt3;
34                 }
35
36                 if (dt1.Rows[count1][key]==dt2.Rows[count2][key])
37                 {
38                     //赋值给新的一列
39                     DataRow dr = dt3.NewRow();
40                     for(int i=0;i<dt1.Columns.Count;i++)
41                     {
42                         dr[dt1.Columns[i].ColumnName] = dt1.Rows[count1][dt1.Columns[i].ColumnName];
43                     }
44                     for(int i=0;i<dt2.Columns.Count;i++)
45                     {
46                         dr[dt2.Columns[i].ColumnName] = dt2.Rows[count2][dt2.Columns[i].ColumnName];
47                     }
48                     dt3.Rows.Add(dr.ItemArray);
49                     count1++;
50                     count2++;
51                 }
52             }
53
54             return dt3;
55         }
56
57
58         //对DataTable排序
59         private DataTable sort_desc(DataTable dt1,string key)
60         {
61             DataTable dt2 = dt1.Clone();
62             DataRow[] dr= dt1.Select("", key + " desc");
63             for (int i = 0; i < dr.Length; i++)
64             {
65                 dt2.Rows.Add(dr[i].ItemArray);
66             }
67             return dt2;
68         }

五、准备写好更多datatable合并类似于pandas.merge的例子,封装成一个dll文件。整体的文件见:https://github.com/cysisu/datatable-,后续会继续更新

原文地址:https://www.cnblogs.com/cysisu/p/10753195.html

时间: 2024-10-11 13:00:55

c# datatable按主键合并相同主键返回新的datatable的相关文章

将DataTable中的某一行复制到另一个新的DataTable(转)

===前提:我们已经有一个DataTable的数据表 现在需要的只是其中的一行数据=== 比如说下面这段代码在一个方法里 返回的就是一个DataTable! sqlCon = new SqlConnection(strCon);             sqlCom = new SqlCommand();             sqlCom.Connection = sqlCon;             sqlCom.CommandText = "select_v";       

c# DataTable select 过滤返回新DataTable

Select(); Select("id>='3' and name='3--hello'");//支持and Select("id>='3' or id='1'");//支持or Select("name like '%hello%'");//支持like Select("id>5","id desc"); Select("id>5", "id des

MM(主主数据库)+keepalived主备高可用集群

博客分享的第一篇技术文章: 项目主要搭建:主主数据库高可用集群搭建. 数据库互为主备,应用技术:MM+keepalived 使用的是虚拟机搭建的实验向大家展示: 数据库1:192.168.4.7 数据库2:192.168.4.77 VIP:192.168.4.68 web1:192.168.4.69 web2:192.168.4.70 一.安装mysql,部署主主同步结构. 直接yum安装 配置主主同步: 由于主数据库192.168.4.7里面存放着数据,所以需要先导出数据,方法很多,我们采取m

mybatis自增主键返回

自增主键的返回: mysql自增主键,执行insert提交之前自动生成一个自增主键. 通过mysql函数获取到刚插入记录的自增主键: LAST_INSERT_ID() 是insert之后调用此函数. 修改insertUser定义: 非自增主键返回: 使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位. 执行思路: 先通过uuid()查询到主键,将主键输入 到sql语句中. 执行uuid()语句顺序相对于insert语句之前执行. 通过oracle的

mybatis主键返回

在项目开发中,有时需要获取主键值. 比如在表的关联关系中,将数据插入主表之后需要再插入子表,我们需要把主表的主键作为外键插入子表中. 这样的话就需要获取主键值了. 所以涉及主键返回的问题. 1.自增主键的返回 MYSQL自增主键,执行insert提交之前自动生成一个自增主键. 通过mysql函数获取到刚刚插入的记录的自增主键. LAST_INSERT_ID(),在insert之后调用此函数. <insert id="insertUser" parameterType="

mybatis入门--主键返回(九)

自增主键返回 mysql自增主键,执行insert提交之前自动生成一个自增主键. 通过mysql函数获取到刚插入记录的自增主键: LAST_INSERT_ID() 是insert之后调用此函数. 修改insertUser定义: 非自增主键返回(使用uuid()) 使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位. 执行思路: 先通过uuid()查询到主键,将主键输入 到sql语句中. 执行uuid()语句顺序相对于insert语句之前执行. 通过

错误: 在类 com.zs.container.CollectionData 中找不到主方法, 请将主方法定义为: public static void main(String[] args)

错误: 在类 com.zs.container.CollectionData 中找不到主方法, 请将主方法定义为: public static void main(String[] args) package com.zs.container; import java.util.ArrayList; import com.java.array.generator.CountingGenerator.String; import com.java.array.generator.CountingG

从足球看--主主、主从、主备

今天学习了mysql的主从复制,有很多的概念性东西:主主,主从,主备,因为自己是一个足球迷,然后突然觉的这几个概念性的东西可以用足球来解释,有说错的地方望各位读者指出批评,一起探讨. 我排出的是一个433的阵型,三条线可以想像成提供的三个服务,门将我觉的是防火墙再合适不过了,因为今天学的是mysql我就以前锋线来形容mysql进行解释. 首先服务器想达到一个负载均衡而且安全的效果故而进行了主从复制,我现在架设中锋是主,另外两个就是从,三个人之间都有一个共同的目的,这就是主从了.这种做法已经非常好

mybatis的执行流程 #{}和${} Mysql自增主键返回

n Mybatis配置 全局配置文件SqlMapConfig.xml,配置了Mybatis的运行环境等信息. Mapper.xml文件即Sql映射文件,文件中配置了操作数据库的Sql语句.此文件需要在SqlMapConfig.xml中加载. n 通过Mybatis环境等配置信息构造SqlSessionFactory,即会话工厂. n 由会话工厂创建SqlSession即会话,操作数据库需要通过SqlSession进行. n Mybatis底层自定义了Executor执行器接口操作数据库,Exec