使用LINQ删除重复项"删除重复项时出错:无法转换类型' System.Int32'输入' System.String'。"

时间:2015-01-08 15:56:45

标签: c# .net linq datatable

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

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类型,我如何删除重复的值?

1 个答案:

答案 0 :(得分:5)

您可以将方法设为通用:

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