使用 LINQ 删除重复项将返回“删除重复项时出错:无法将类型为'System.Int32'的对象强制转

本文关键字:删除 System Int32 对象 返回 LINQ 出错 类型 使用 | 更新日期: 2023-09-27 18:36:58

我使用以下函数删除DataTable中名为keyField的某个字段的所有重复值。

public DataTable RemoveDuplicates(DataTable dt, string keyField)
{
    IEnumerable<DataRow> uniqueContacts = dt.AsEnumerable()
                            .GroupBy(x => x.Field<string>(keyField))
                            .Select(g => g.First());
    DataTable dtOut = uniqueContacts.CopyToDataTable();
    return dtOut;
}

但是,当keyField的数据类型是Int32时,这将产生以下异常:

无法将类型为"System.Int32"的对象强制转换为类型"System.String"。

即使keyField不是 string 类型,如何删除重复值?

使用 LINQ 删除重复项将返回“删除重复项时出错:无法将类型为'System.Int32'的对象强制转

你可以使你的方法泛型:

public DataTable RemoveDuplicates<T>(DataTable dt, string keyField)
{
    IEnumerable<DataRow> uniqueContacts = dt.AsEnumerable()
                        .GroupBy(x => x.Field<T>(keyField))
                        .Select(g => g.First());
    DataTable dtOut = uniqueContacts.CopyToDataTable();
    return dtOut;
}

然后指定列类型调用它

RemoveDuplicates<int>(dt, "id");

如果不知道类型,另一个选项是使用 DataRow 的索引器而不是Field方法:

public DataTable RemoveDuplicates(DataTable dt, string keyField)
{
    IEnumerable<DataRow> uniqueContacts = dt.AsEnumerable()
                        .GroupBy(x => x[keyField].ToString())
                        .Select(g => g.First());
    DataTable dtOut = uniqueContacts.CopyToDataTable();
    return dtOut;
}