一、概述:

在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中

三、展示结果:

     

四、代码:

 //对两个datatable进行排序
private DataTable unite_on_datatable(DataTable dt1, DataTable dt2, string key)
{
DataTable dt3 = dt1.Clone();
for (int i = 0; i < dt2.Columns.Count; i++)
{
if (dt2.Columns[i].ColumnName.ToLower() != key.ToLower())
{
dt3.Columns.Add(dt2.Columns[i].ColumnName);
}
} //先排序
dt1 = sort_desc(dt1, key);
dt2 = sort_desc(dt2, key); int count1 = 0, count2 = 0;
while (true)
{
string heatid1 = dt1.Rows[count1][key].ToString();
string heatid2= dt2.Rows[count2][key].ToString();
if (count1 >= (dt1.Rows.Count) || (count2 >= (dt2.Rows.Count)))
return dt3; if (string.Compare(dt1.Rows[count1][key].ToString(), dt2.Rows[count2][key].ToString()) > 0)
{
//找到
while (string.Compare(dt1.Rows[count1][key].ToString(), dt2.Rows[count2][key].ToString()) > 0)
{
string heat_id1 = dt1.Rows[count1][key].ToString();
string heat_id2 = dt2.Rows[count2][key].ToString();
count1++;
if (count1 >= dt1.Rows.Count)
return dt3;
} while (string.Compare(dt1.Rows[count1][key].ToString(), dt2.Rows[count2][key].ToString()) < 0)
{
count2++;
if (count2 >= dt2.Rows.Count)
return dt3;
}
} else if(string.Compare(dt1.Rows[count1][key].ToString(), dt2.Rows[count2][key].ToString()) < 0)
{
while (string.Compare(dt1.Rows[count1][key].ToString(), dt2.Rows[count2][key].ToString()) < 0)
{
count2++;
if (count2 >= dt2.Rows.Count)
return dt3;
} //找到
while (string.Compare(dt1.Rows[count1][key].ToString(), dt2.Rows[count2][key].ToString()) > 0)
{
count1++;
if (count1 >= dt1.Rows.Count)
return dt3;
}
} if (string.Compare(dt1.Rows[count1][key].ToString(), dt2.Rows[count2][key].ToString()) == 0)
{
//赋值给新的一列
DataRow dr = dt3.NewRow();
for (int i = 0; i < dt1.Columns.Count; i++)
{
dr[dt1.Columns[i].ColumnName] = dt1.Rows[count1][dt1.Columns[i].ColumnName];
}
for (int i = 0; i < dt2.Columns.Count; i++)
{
dr[dt2.Columns[i].ColumnName] = dt2.Rows[count2][dt2.Columns[i].ColumnName];
}
dt3.Rows.Add(dr.ItemArray);
count1++;
count2++;
}
} } //对DataTable排序
private DataTable sort_desc(DataTable dt1, string key)
{
DataTable dt2 = dt1.Clone();
DataRow[] dr = dt1.Select("", key + " desc");
for (int i = 0; i < dr.Length; i++)
{
dt2.Rows.Add(dr[i].ItemArray);
}
return dt2;
}

  

 五、总结

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

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

  1. c# DataTable select 过滤返回新DataTable

    Select(); Select("id>='3' and name='3--hello'");//支持and Select("id>='3' or id=' ...

  2. 简单练习题2编写Java应用程序。首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”、“取款”和“余额查询”。其次, 编写一个主类,在主类中测试Account类的功能

    编写Java应用程序.首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”.“取款”和“余额查询”.其次, 编写一个主类,在主类中测试Account类的 ...

  3. MyBatis主键返回

    在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数:如果业务层需要得到记录的主键时,可以通过配置的方式来完成这个功能. 比如在表的关联关系中,将数据插入主 ...

  4. insert主键返回 selectKey使用

    有时候新增一条数据,知道新增成功即可,但是有时候,需要这条新增数据的主键,以便逻辑使用,再将其查询出来明显不符合要求,效率也变低了. 这时候,通过一些设置,mybatis可以将insert的数据的主键 ...

  5. MySQL+MGR 单主模式和多主模式的集群环境 - 部署手册 (Centos7.5)

    MySQL Group Replication(简称MGR)是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决方案.MGR是MySQL官方在5.7.17版本引进的一个数据库高可用与 ...

  6. Mybatis里Mapper映射sql文件里insert的主键返回selectKey使用

    有时候新增一条数据,知道新增成功即可,但是有时候,需要这条新增数据的主键,以便逻辑使用,再将其查询出来明显不符合要求,效率也变低了. 这时候,通过一些设置,mybatis可以将insert的数据的主键 ...

  7. mybatis由浅入深day01_4.7根据用户名称模糊查询用户信息_4.8添加用户((非)自增主键返回)

    4.7 根据用户名称模糊查询用户信息 4.7.1 映射文件 使用User.xml,添加根据用户名称模糊查询用户信息的sql语句. 4.7.2 程序代码 控制台: 4.8 添加用户 4.8.1 映射文件 ...

  8. mybatis的执行流程 #{}和${} Mysql自增主键返回 resultMap 一对多 多对一配置

    n Mybatis配置 全局配置文件SqlMapConfig.xml,配置了Mybatis的运行环境等信息. Mapper.xml文件即Sql映射文件,文件中配置了操作数据库的Sql语句.此文件需要在 ...

  9. haproxy+keepalived主备与双主模式配置

    Haproxy+Keepalived主备模式 主备节点设置 主备节点上各安装配置haproxy,配置内容且要相同 global log 127.0.0.1 local2 chroot /var/lib ...

随机推荐

  1. python基础3、4---流程控制、运算符

    1.for循环 和while循环 for 临时变量 in 待遍历的数据: 循环体 (循环体这里一般加break,结束循环,执行else代码) else: 循环不满足条件执行的代码 while  表达式 ...

  2. 博三F5第一次站立会议(2019-03-09)

    时间:2017-03-09 地点:博三414寝室 时长:一个小时 到勤:全员到勤.(注:寝室有点乱,不敢附上会议图片~~~) 谈论内容: 大致确定本周计划与下周打算(注:后期可能有所改变) 本周计划: ...

  3. 软件测试第四次作业—— 性能测试(含JMeter实验)

                                           性能测试(含JMeter实验) 一.概览 1.性能测试有几种类型,它们之间什么关系? 2.搭建并简单配置一个JMeter的 ...

  4. hightcharts详细教程

    1.初始化highcharts var chart = Highcharts.chart('container', options); 2.options 自定义图表的配置项 const option ...

  5. 从码云上下载react项目并配置成可运行状态

    (第一次写,如有不足之处,欢迎指出) 一.下载项目: 1.首先保证安装了git, 2.然后在本地想要存放项目位置打开git(Git Bash Here),再复制码云中如图所示的地址: 3.在git中输 ...

  6. Request、Response

    Request Request对象在我们写爬虫发送请求的时候调用,参数如下: url: 就是需要请求的url callback: 指定该请求返回的Response由那个函数来处理. method: 请 ...

  7. JavaScript基础之对象属性的检测和枚举

    属性检测 对象作为属性的集合,属性又包括自有属性和继承属性: 检测方法: \__   in运算符: \__ var obj = { x:1 } console.log( 'toString' in o ...

  8. java——————基础总结2

    一 程序中常见的错误: 1,语法错误 2, 逻辑错误 3,运行时错误 二 定义class类的时候,如果前面加个public 那么class的类名必须要和文件名一致,否则就会 出现编译错误 三 编译源文 ...

  9. 数据库关闭,shutdown三种语句。

    1.shutdown normal     正常方式关闭数据库. 2.shutdown immediate     立即方式关闭数据库.     在SVRMGRL中执行shutdown immedia ...

  10. 文件IO 相关的包:java.io文件——API

    文件IO 相关的包:java.io文件——API 1.Java.io.File类的使用(1)两种路径绝对路径:相对于当前路径:当前为 “工程名”(2)File类创建,对象为一个文件/目录,可能存在或不 ...