【问题标题】:Removing duplicates using LINQ returns "Error removing duplicates: Unable to cast object of type 'System.Int32' to type 'System.String'."使用 LINQ 删除重复项返回“删除重复项时出错:无法将 'System.Int32' 类型的对象转换为 'System.String' 类型。”
【发布时间】:2015-01-08 15:56:44
【问题描述】:

我正在使用以下函数来删除 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 类型,我如何才能删除重复值?

【问题讨论】:

  • 你知道调用这个方法时的数据类型吗?
  • 没错!但我怀疑它不是 varchar 或 integer。

标签: c# .net linq datatable


【解决方案1】:

你可以让你的方法通用:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    相关资源
    最近更新 更多