最基本的写法无非是写多层foreach循环,数据量多了,循环的次数是乘积增长的。

这里推荐使用Except()差集、Intersect()交集,具体性能没有进行对比。

如果两个datatable的字段完全一致的话,可以直接使用Except,Intersect

//与免打扰中的用户进行比较,筛选出可以正常接收推送的用户
var normalReceive = dtUser.AsEnumerable().Except(dtDND.AsEnumerable(), DataRowComparer.Default);

//比对两个表的用户名一致的,保存username到list中
var intersectUser = dtUserPower.AsEnumerable().Intersect(normalReceive, DataRowComparer.Default);

  
foreach (var item in intersectUser)
{
listTemp.Add(item["username"].ToString());
}

如果两个datatable中有部分字段相同,也就是说有可进行比对的字段的话。

//与免打扰中的用户进行比较,筛选出可以正常接收推送的用户
var normalReceive = from r in dtUser.AsEnumerable()
where
!(from rr in dtDND.AsEnumerable() select rr.Field<string>("username")).Contains(
r.Field<string>("username"))
select r;

//比对两个表的用户名一致的,保存token到list中
var intersectUser = from r in normalReceive.AsEnumerable()
where
(from rr in dtUserPower.AsEnumerable() select rr.Field<string>("username")).Contains(
r.Field<string>("username"))
select r;

foreach (var item in intersectUser)
{
listTemp.Add(item["token"].ToString());
}

C# 两个datatable中的数据快速比较返回交集或差集[z]的更多相关文章

  1. C# 两个datatable中的数据快速比较返回交集或差集

    转自: https://www.cnblogs.com/lacey/p/5893380.html 如果两个datatable的字段完全一致的话,可以直接使用Except,Intersect //Exc ...

  2. 【转载】C#的Merge方法合并两个DataTable对象的数据

    在C#中的Datatable类中,可以使用DataTable类的Merge方法对两个相同结构的DataTable对象进行求并集运算,将两个DataTable对象的数据行合并到其中一个DataTable ...

  3. 使用excel中的数据快速生成sql语句

    在小公司的话,总是会有要开发去导入历史数据(数据从旧系统迁移到新系统上)的时候.这个时候,现场实施或客户会给你一份EXCEL文档,里面包含了一些别的系统上的历史数据,然后就让你导入到现在的系统上面去. ...

  4. 从DataTable中查询数据

    /// <summary> /// 从DataTable中查询数据 /// </summary> /// <param name="tb">待处 ...

  5. SqlBulkCopy将DataTable中的数据批量插入数据库中

    #region 使用SqlBulkCopy将DataTable中的数据批量插入数据库中 /// <summary> /// 注意:DataTable中的列需要与数据库表中的列完全一致.// ...

  6. 【转载】C#中遍历DataTable中的数据行

    在C#中的Datatable数据变量的操作过程中,有时候我们需要遍历DataTable变量获取每一行的数据值,例如将DataTable变量转换为List集合的时候,我们就会遍历DataTable变量, ...

  7. list转datatable,SqlBulkCopy将DataTable中的数据批量插入数据库

    /// <summary> /// 将泛类型集合List类转换成DataTable /// </summary> /// <param name="list&q ...

  8. 怎样简单灵活地将DataTable中的数据赋值给model

    最近在做的一个项目中,有13个方法都需要用到同一种处理方式:通过SQL语句从数据库获取一条指定的数据,并将该数据中的每个值都赋值给一个model,再将这个model中的数据通过微信发送出去.每个方法都 ...

  9. DataTable中的数据赋值给model z

    create table memberinfo ( member_id int, member_name varchar(20), member_birthday varchar(50) ) go / ...

随机推荐

  1. JDK源码中使用的设计模式

    结构型模式: 适配器模式: 用来把一个接口转化成另一个接口. java.util.Arrays#asList() javax.swing.JTable(TableModel) java.io.Inpu ...

  2. [C#]位运算符

    参考链接: http://www.runoob.com/csharp/csharp-operators.html 表: 简单来说,就是: &:全1为1,否则为0 |:有1为1,否则为0 ^:不 ...

  3. 【HDFS API编程】图解客户端写文件到HDFS的流程

  4. Mysql 5 忘记root密码,设置免密登陆

    1.修改my.cnf配置文件 vi /etc/my.cnf #允许免密认证登陆 skip-grant-tables = true 2.重启Mysql数据库并登陆数据库修改root用户密码 system ...

  5. Tools:实现ping操作带时间戳【windows+linux】

    [windows下]: ping.vbs Dim args, flag, unsuccOut args="" otherout="" flag= If WScr ...

  6. Shell 批量修改主机 用户密码

    问题:132.121.114 和 132.121.118 网段共 48 台主机未添加基础监控,但是 wh 账户不能登录 需进行批量修改密码操作. 目前情况:op1对上述48台机器设备均能免密登录. 操 ...

  7. 逃逸分析(Escape Analysis)

    一.什么是逃逸 逃逸是指在某个方法之内创建的对象,除了在方法体之内被引用之外,还在方法体之外被其它变量引用到:这样带来的后果是在该方法执行完毕之后,该方法中创建的对象将无法被GC回收,由于其被其它变量 ...

  8. laravel5.6中Session store not set on request问题如何解决

    先找到文件app下的Kernel.php文件,在文件中加入下列代码 protected $middleware = [ \Illuminate\Foundation\Http\Middleware\C ...

  9. 为什么移动构造要使用noexcept

    vector::push_back操作,保证了如果过程中出现异常,vector不会发生变化. push_back过程中,可能会因为已有内存空间不够,申请新的内存,同时把原内存中已有的元素,放到新申请的 ...

  10. Day05 -寻找自己:Ruby的self物件与singleton method

    前情提要:在第四天里,我们用参赛者的例子解说实体方法与类别方法.类别中的实体物件,想要玩弄方法时,可以有三种取用方式:(跟斯斯有三种一样) 该类别所定义的实体方法. 模块中可取得的实体方法.(关于模块 ...