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

dis*_*kid 2 .net c# linq datatable

我正在使用以下函数来删除keyField在a中调用的某个字段的所有重复值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;
}
Run Code Online (Sandbox Code Playgroud)

然而,当所述的数据类型keyField是一个Int32,这将产生下面的例外:

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

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

Sel*_*enç 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;
}
Run Code Online (Sandbox Code Playgroud)

然后调用它指定列类型

RemoveDuplicates<int>(dt, "id");
Run Code Online (Sandbox Code Playgroud)

如果您不知道类型,则另一个选项是使用索引器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;
}
Run Code Online (Sandbox Code Playgroud)