【问题标题】:LINQ operation creating cast exceptionLINQ 操作创建强制转换异常
【发布时间】:2018-05-20 08:17:00
【问题描述】:

从 Excel 文件填充的数据表中读取数据时,出现“无法将 'System.Double' 类型的对象转换为 'System.String' 类型。”列数据类型为 double 时的异常。我的代码如下所示

 var importedProducts = dtImportedData.AsEnumerable()
                        .Where(dtProduct => !string.IsNullOrWhiteSpace(dtProduct.Field<string>("product_id")))
                        .Select(dtProduct => new
                        {
                            product_id = dtProduct.Field<string>("product_id").Trim(),                              
                            product_qty = Convert.ToInt32(dtProduct.Field<double>("product_qty "))
                        }).ToList();

当 product_id 列具有文本数据类型时,一切正常。但是当有双重数据类型时,它会抛出异常。

我已经尝试过here的解决方案

【问题讨论】:

  • 那么您有一个列可以神奇地将其类型更改为另一种类型?
  • @Steve,你是对的。用户根据自己的意愿更改excel列数据类型,我们无法控制。
  • 从逻辑上讲,您不应该使用相同的代码来读取不同的数据类型。

标签: excel linq c#-4.0 datatable


【解决方案1】:

好吧,如果product_id 是一个双精度而不是一个字符串,那你为什么要把它转换成string 呢?

.Where(row => !string.IsNullOrWhiteSpace(row.Field<double>("product_id").ToString()))
.Select(row => new
 {
    product_id = row.Field<double>("product_id"),                              
    product_qty = (int)row.Field<double>("product_qty")
 })

我不喜欢包含 doubledouble? 的字段的 !string.IsNullOrWhiteSpace 方法。我很确定你可以使用(待测试):

.Where(row => row.Field<double?>("product_id").HasValue)
.Select(row => new
 {
   product_id = row.Field<double?>("product_id").Value,                              
   product_qty = (int)row.Field<double>("product_qty")
 })

如果您不知道DataTableDataColumn 的类型,您可以在调试器中执行此操作:

dtImportedData.Columns["product_id"].DataType;

这是您必须在Field&lt;T&gt; 中使用的内容。


如果类型真的如评论的那样发生变化,这是最安全的:

.Where(row => !string.IsNullOrWhiteSpace(row["product_id"].ToString()))
.Select(row => new
 {
    product_id = row["product_id"].ToString().Trim(),                              
    product_qty = int.Parse(row["product_qty"].ToString().Trim())
 })

【讨论】:

  • Tim Schmelter,product_id 数据类型是字符串。但是我正在从 excel 文件中填充 dtImportedData 变量,并且用户不断更改 excel 列数据类型。
  • @user1926138:我不明白,是字符串还是双精度或变化,它是什么?您在答案末尾看到了我的提示吗?
  • 它的变化。用户可以在 Excel 表中使用任何数据类型,我需要将其转换为字符串。
  • @user1926138:添加了另一种方法
猜你喜欢
  • 2019-04-05
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
相关资源
最近更新 更多