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

VB.NET中含指定列的DataTable后台代码去重方法咨询

搞定DataTable去重:获取三列组合的唯一值

嘿,我来帮你解决这个DataTable去重的问题!针对你包含HOUSE_BILL_KEY、HOUSE_BILL_SRC_ID、SRC_RCRD_ID三列的DataTable,这里有两种实用的后台代码实现方式,都是基于三列组合唯一来过滤重复项的:

方法1:使用DataView的ToTable方法(兼容.NET Framework)

这是ADO.NET里最经典的去重方式,代码简单且兼容性强,适合传统项目:

// 假设你的原始DataTable名为originalDt
DataView dv = new DataView(originalDt);
// 调用ToTable,参数分别是:是否去重、要保留的列名数组
DataTable distinctDt = dv.ToTable(true, "HOUSE_BILL_KEY", "HOUSE_BILL_SRC_ID", "SRC_RCRD_ID");

解释一下:true表示开启去重,后面的列名数组指定了用来判断重复的列——只有当这三列的值完全相同时,才会被视为重复项过滤掉。

方法2:使用Linq to DataSet(简洁高效,推荐.NET Core/.NET 5+)

如果你用的是较新的.NET框架,Linq写法会更简洁直观。这里分两种情况:

情况A:使用DistinctBy(.NET Core 3.0+/NET 5+)

DistinctBy可以直接指定去重的键,代码非常清爽:

using System.Linq;
using System.Data;

// 假设originalDt是你的原始DataTable
var distinctRows = originalDt.AsEnumerable()
    .DistinctBy(row => new {
        HouseBillKey = row.Field<string>("HOUSE_BILL_KEY"), // 根据实际数据类型调整,比如int
        HouseBillSrcId = row.Field<string>("HOUSE_BILL_SRC_ID"),
        SrcRcrdId = row.Field<string>("SRC_RCRD_ID")
    });

// 将Linq结果转回DataTable
DataTable distinctDt = distinctRows.CopyToDataTable();

情况B:兼容旧版.NET(用GroupBy)

如果你的项目是.NET Framework 4.x这类不支持DistinctBy的版本,可以用GroupBy来实现:

using System.Linq;
using System.Data;

var distinctRows = originalDt.AsEnumerable()
    .GroupBy(row => new {
        HouseBillKey = row.Field<string>("HOUSE_BILL_KEY"),
        HouseBillSrcId = row.Field<string>("HOUSE_BILL_SRC_ID"),
        SrcRcrdId = row.Field<string>("SRC_RCRD_ID")
    })
    .Select(g => g.First()); // 取每个分组的第一行

DataTable distinctDt = distinctRows.CopyToDataTable();

注意事项

  • 记得根据你的实际数据类型调整Field<T>里的泛型参数,比如如果HOUSE_BILL_KEY是int类型,就写row.Field<int>("HOUSE_BILL_KEY")。
  • 如果只需要基于某一列去重(比如只按HOUSE_BILL_KEY),只需要修改列名数组或者GroupBy的键即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 06:22:29