使用 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;
}
我正在使用以下函数删除 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;
}