使用 LINQ returns "Error removing duplicates: Unable to cast object of type 'System.Int32' to type 'System.String'." 删除重复项

Removing duplicates using LINQ returns "Error removing duplicates: Unable to cast object of type 'System.Int32' to type 'System.String'."

我正在使用以下函数删除 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 时,这将产生以下异常:

Unable to cast object of type 'System.Int32' to type 'System.String'.

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

您可以使您的方法通用:

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;
}