You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET中如何筛选仅存在于DataSet A而不在DataSet B中的行?

筛选DataSet中未在另一个DataSet出现的行组合

这事儿好办!针对你在.NET环境下要筛选DsA中ColA+ColB组合未出现在DsB里的行需求,咱们可以用LINQ to DataSet来实现,两种常见写法供你参考:

方法一:用HashSet优化查询性能(推荐大数据量场景)

先把DsB里的所有ColA+ColB组合存入哈希集合,这样后续查找的效率会很高(O(1)时间复杂度),避免嵌套遍历的性能损耗:

using System.Data;
using System.Linq;
using System.Collections.Generic;

// 提取DsB中的(ColA, ColB)组合到HashSet
var bCombinations = new HashSet<Tuple<int, int>>(
    DsB.Tables[0].AsEnumerable()
        .Select(row => Tuple.Create(
            row.Field<int>("ColA"), 
            row.Field<int>("ColB")
        ))
);

// 筛选DsA中不在HashSet里的行
DataTable resultTable = DsA.Tables[0].AsEnumerable()
    .Where(row => !bCombinations.Contains(
        Tuple.Create(
            row.Field<int>("ColA"), 
            row.Field<int>("ColB")
        )
    ))
    .CopyToDataTable();

方法二:直接用LINQ嵌套查询(小数据量更直观)

如果你的数据量不大,这种写法更贴合你需求里的逻辑,直接判断DsA的每一行是否在DsB中没有匹配的组合:

using System.Data;
using System.Linq;

DataTable resultTable = DsA.Tables[0].AsEnumerable()
    .Where(aRow => !DsB.Tables[0].AsEnumerable()
        .Any(bRow => bRow.Field<int>("ColA") == aRow.Field<int>("ColA") 
                  && bRow.Field<int>("ColB") == aRow.Field<int>("ColB")))
    .CopyToDataTable();

验证你的示例数据

针对你给出的测试数据:

  • DsA行:(1,10), (1,11), (2,12), (3,13), (4,14)
  • DsB行:(1,9), (1,10), (2,12), (3,15)

两种方法都会返回符合预期的行:(1,11), (3,13), (4,14)

额外提示

如果你的ColA或ColB列可能存在DBNull值,记得把字段类型改成可空类型(比如int?),并在判断相等时处理空值情况,比如:

// 处理空值的判断逻辑
bRow.Field<int?>("ColA") == aRow.Field<int?>("ColA") 
&& bRow.Field<int?>("ColB") == aRow.Field<int?>("ColB")

内容的提问来源于stack exchange,提问作者Laba Ningombam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:46:44