求一个高效对比算法,比较两个DataTable差异数据

xu51150jie 2019-04-03 02:39:16


现在有2个上面图片里的DataTable表。

需要把DataTable1里面和DataTable2 根据【A】列重复的去掉。

就是得到DataTable1里的 x和y列 如下面图
...全文
2761 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
纵马饮白虹 2019-04-08
  • 打赏
  • 举报
回复
遍历table2中A列的数据 做哈希散列
创建第三个table table3
之后遍历table1,通过哈希散列算法 判断当前A列的值是否存在于table2中,如果不存在,将该行添加到table3中
如果用Java描述
就是将table2中A列的数据放到HashSet/HashMap中
之后遍历table1,通过contains判断,将不存在于table2中的记录添加到table3中
qq_44864561 2019-04-06
  • 打赏
  • 举报
回复
思路要清醒A列表要索引和排序,要改进一下算法,提高效率。
weixin_44878055 2019-04-05
  • 打赏
  • 举报
回复
感谢楼主的分享但是我不会
  • 打赏
  • 举报
回复
20楼的可以,那么15楼的也是可以的. 自己写循环去判断数据表的所有行指定列进行比较. 调用现成函数也离不开循环,都一样.
「已注销」 2019-04-04
  • 打赏
  • 举报
回复
引用 25 楼 智者知已应修善业 的回复:
20楼的代码你试看,什么包,哪有什么包?不懂!
15楼的代码无非就是换个函数,还有转为字符串进行运算,分开写法,其他都一样.


20楼的是可以实现 但是速度不理想
  • 打赏
  • 举报
回复
想要这个?喏都在这里

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace C_解答专用窗体
{
    public partial class Form1 : Form//, INotifyPropertyChanged
    {
        public Form1()
        {
            InitializeComponent();
            
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            DataTable aa = new DataTable(), bb = new DataTable();
            foreach (string ss in "内码 简拼 品名 成份名 药品类别 规格 配伍禁忌".Split(' '))
                aa.Columns.Add(ss);
            var ff = "47019 RS 人参 人参 人参 支 藜芦;1111 LL 藜芦 藜芦 藜芦 g 人参,党参,玄参,西洋参,细辛;33212 XX 细辛 细辛 细辛 g 藜芦;2222 RS 蚺蛇 蚺蛇 蚺蛇 g 全蝎"
                .Split(';').Select(dd => dd.Split(' ')).ToArray();
            ff.Select(dd => aa.Rows.Add(dd)).ToArray();

            foreach (string ss in "内码 简拼".Split(' '))
                bb.Columns.Add(ss);
            var ff1 = "47019 yy;1111 er;aaa sv;aas mj;ccc RS;aas dg;vvv nhgn;aas hj;iu RS;aas fgjk;456 RS;aas kfg;erte fd;gfdgdfg sdfg"
                .Split(';').Select(dd => dd.Split(' ')).ToArray();
            ff1.Select(dd => bb.Rows.Add(dd)).ToArray();

            foreach (DataRow dd in bb.Rows)
            {
                var ee = aa.Rows.Cast<DataRow>().FirstOrDefault(hh => hh.ItemArray[0].ToString() == dd.ItemArray[0].ToString());
                if (ee != null) aa.Rows.Remove(ee);
            }

            //DataRow[] ww = { };
            //foreach (DataRow dd in bb.Rows)
            //    ww = ww.Concat(aa.Rows.Cast<DataRow>().Where(hh => hh.ItemArray[0].ToString() == dd.ItemArray[0].ToString())).ToArray();
            //foreach (DataRow rr in ww) aa.Rows.Remove(rr);
           
        }
        //**************************************************
    }
}
  • 打赏
  • 举报
回复
20楼的代码你试看,什么包,哪有什么包?不懂! 15楼的代码无非就是换个函数,还有转为字符串进行运算,分开写法,其他都一样.
  • 打赏
  • 举报
回复
无非就是对数据表的操作,办法很多,道理大多相似.
「已注销」 2019-04-04
  • 打赏
  • 举报
回复
引用 21 楼 智者知已应修善业 的回复:
我在W7和W10测试都没报错?

你把你的包给我把
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
我在W7和W10测试都没报错?
  • 打赏
  • 举报
回复

//DataRow[] ww = { };
            //foreach (DataRow dd in bb.Rows)
            //    ww = ww.Concat(aa.Rows.Cast<DataRow>().Where(hh => hh.ItemArray[0].ToString() == dd.ItemArray[0].ToString())).ToArray();
            //foreach (DataRow rr in ww) aa.Rows.Remove(rr);
「已注销」 2019-04-04
  • 打赏
  • 举报
回复
引用 15 楼 智者知已应修善业 的回复:


还是报【序列不包含任何匹配元素】问题
秋的红果实 2019-04-03
  • 打赏
  • 举报
回复
上面算法,最坏耗时O(m*n) 如果A列已经排序,那就可以改进算法,弄个折半查找,就可以提高不少
秋的红果实 2019-04-03
  • 打赏
  • 举报
回复
datatable2的A列没有排序情况下

protected void removeItem(DataTable dt1,DataTable dt2)
{
    for (int i = 0; i < dt1.Rows.Count; i++)
    {
        for (int j = 0; j < dt2.Rows.Count; j++)
        {
            if (dt2.Rows[j][0].ToString() == dt1.Rows[i][0].ToString())
            {
                dt1.Rows.RemoveAt(i);
                break;

            }
        }
    }
}

重复调用该方法100万次,耗时2秒多

System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
for (int n = 0; n < 1000000; n++)
{
    removeItem(dt1, dt2);
}
sw.Stop();
Response.Write(sw.ElapsedMilliseconds.ToString() + "<br />");

  • 打赏
  • 举报
回复
「已注销」 2019-04-03
  • 打赏
  • 举报
回复
引用 13 楼 智者知已应修善业 的回复:
喏,拿去

void 请问如何查找多个符合条件的值()
{
DataTable aa = new DataTable(), bb = new DataTable();
foreach (string ss in "内码 简拼 品名 成份名 药品类别 规格 配伍禁忌".Split(' '))
aa.Columns.Add(ss);
var ff = "47019 RS 人参 人参 人参 支 藜芦;1111 LL 藜芦 藜芦 藜芦 g 人参,党参,玄参,西洋参,细辛;33212 XX 细辛 细辛 细辛 g 藜芦;2222 RS 蚺蛇 蚺蛇 蚺蛇 g 全蝎"
.Split(';').Select(dd => dd.Split(' ')).ToArray();
ff.Select(dd => aa.Rows.Add(dd)).ToArray();
bb = aa.Copy(/*求一个高效对比算法,比较两个DataTable差异数据https://bbs.csdn.net/topics/392562169*/);
bb.Rows.RemoveAt(0); bb.Rows.RemoveAt(0);
bb.Columns.RemoveAt(bb.Columns.Count - 1); bb.Columns.RemoveAt(bb.Columns.Count - 1);
foreach (DataRow dd in bb.Rows) aa.Rows.Remove(aa.Rows.Cast<DataRow>().First(hh => hh.ItemArray[0] == dd.ItemArray[0]));
}






我需要这样的格式,把aa里面列[内码]重复bb的去掉。

最后只要得到aa
内容应该是
 
内码 简拼 品名 成份名 药品类别 规格 配伍禁忌
33212 XX 细辛 细辛 细辛 g 藜芦
2222 RS 蚺蛇 蚺蛇 蚺蛇 g 全蝎


现在就是下面的代码报错呀,你在帮我改改呐

           
DataTable aa = new DataTable(), bb = new DataTable();
foreach (string ss in "内码 简拼 品名 成份名 药品类别 规格 配伍禁忌".Split(' '))
aa.Columns.Add(ss);
var ff = "47019 RS 人参 人参 人参 支 藜芦;1111 LL 藜芦 藜芦 藜芦 g 人参,党参,玄参,西洋参,细辛;33212 XX 细辛 细辛 细辛 g 藜芦;2222 RS 蚺蛇 蚺蛇 蚺蛇 g 全蝎"
.Split(';').Select(dd => dd.Split(' ')).ToArray();
ff.Select(dd => aa.Rows.Add(dd)).ToArray();

foreach (string ss in "内码 简拼".Split(' '))
bb.Columns.Add(ss);
var ff1 = "47019 yy;1111 er;aaa sv;aas mj;ccc RS;aas dg;vvv nhgn;aas hj;iu RS;aas fgjk;456 RS;aas kfg;erte fd;gfdgdfg sdfg;"
.Split(';').Select(dd => dd.Split(' ')).ToArray();
ff1.Select(dd => bb.Rows.Add(dd)).ToArray();

foreach (DataRow dd in bb.Rows) aa.Rows.Remove(aa.Rows.Cast<DataRow>().First(hh => hh.ItemArray[0] == dd.ItemArray[0]));

  • 打赏
  • 举报
回复
喏,拿去

void 请问如何查找多个符合条件的值()
{
DataTable aa = new DataTable(), bb = new DataTable();
foreach (string ss in "内码 简拼 品名 成份名 药品类别 规格 配伍禁忌".Split(' '))
aa.Columns.Add(ss);
var ff = "47019 RS 人参 人参 人参 支 藜芦;1111 LL 藜芦 藜芦 藜芦 g 人参,党参,玄参,西洋参,细辛;33212 XX 细辛 细辛 细辛 g 藜芦;2222 RS 蚺蛇 蚺蛇 蚺蛇 g 全蝎"
.Split(';').Select(dd => dd.Split(' ')).ToArray();
ff.Select(dd => aa.Rows.Add(dd)).ToArray();
bb = aa.Copy(/*求一个高效对比算法,比较两个DataTable差异数据https://bbs.csdn.net/topics/392562169*/);
bb.Rows.RemoveAt(0); bb.Rows.RemoveAt(0);
bb.Columns.RemoveAt(bb.Columns.Count - 1); bb.Columns.RemoveAt(bb.Columns.Count - 1);
foreach (DataRow dd in bb.Rows) aa.Rows.Remove(aa.Rows.Cast<DataRow>().First(hh => hh.ItemArray[0] == dd.ItemArray[0]));
}

「已注销」 2019-04-03
  • 打赏
  • 举报
回复
引用 9 楼 智者知已应修善业 的回复:




你把你的这个程序发给我把
「已注销」 2019-04-03
  • 打赏
  • 举报
回复
引用 10 楼 智者知已应修善业 的回复:
干脆不用求交集

DataTable aa = new DataTable(), bb = new DataTable();
//假设aa bb 都有数据
foreach (DataRow dd in bb.Rows) aa.Rows.Remove(aa.Rows.Cast<DataRow>().First(hh => hh.ItemArray[0] == dd.ItemArray[0]));


提示 System.InvalidOperationException:“序列不包含任何匹配元素” 是指什么意思
加载更多回复(10)

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧