.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
相关产品推荐
相关产品推荐

