【问题标题】:Input string not in correct format error during a count with column of only null values在仅包含空值的列的计数期间输入字符串格式错误
【发布时间】:2019-09-16 05:39:43
【问题描述】:

我在 datatable 的特定列中计算某些 int 值(1、2、3 或 4)。该列可以包含的唯一值是 1 到 9(不包括)之间的整数或 null。

例如,具有 10 个条目的典型列如下所示:

Level
  1
  2
  1
  4
  3
  7
  3
  3
(null)
  9

这很好用,尽管是空值。只要有一个非空值,我的代码就可以工作。

但是,当列仅包含空值时,代码会失败,这可能会发生,因为我正在从数据库中提取此数据,并且根据条件,所有结果都可能为空。

我正在使用下面显示的代码来进行此计数。我看了这个问题:Input string was not in a correct format 但我不确定在这种情况下使用TryParse() 的方法。

int countnum = tab2table.AsEnumerable().Where(x => int.Parse(x["Level"].ToString()) == 1 || int.Parse(x["Level"].ToString()) == 2 ||
                                                    int.Parse(x["Level"].ToString()) == 3 || int.Parse(x["Level"].ToString()) == 4).ToList().Count;

对于上面显示的Level 列示例,countnum 应为 7。当该列全部为空时,countnum 应为 0。

即使该列全部为空,如何才能将其更改为工作?我想如果有办法检查列是否为空,我可以把它放在一个 if 语句中,但我还没有找到办法。

【问题讨论】:

  • 你试过x["Level"] != null吗?
  • @JoséPedro 因为这是DataTable,他们可能需要实际检查DBNull。另见:stackoverflow.com/questions/4604414/…
  • @MattBurland 如果我将 ` x["MPerfLevel"] != DBNull.Value && ...` 添加到我的代码中,它仍然给我同样的错误
  • int countnum = tab2table.AsEnumerable().Where(f => f["Level"] != DBNull.Value && (int)f["Level"] > 0 && (int)f["Level"] < 5).Count();

标签: c# winforms


【解决方案1】:

你可以试试这样的:

int countnum = tab2table.AsEnumerable()
     .Select(x => int.TryParse(x["Level"].ToString(), out var d) ? d : (int?)null)
     .Where(x => x >= 1 && x <= 4)
     .Count();

使用TryParse 可以避免空值(或其他非整数值)的问题。如果x["Level"] 为空(或DBNull),则所选值将为空。使用Select 后跟Where 您还可以避免可能将整数解析4次,这是非常低效的,并且由于您现在正在处理可为空的整数,任何空值将始终在where 子句中返回false,导致它们被跳过。

如果您的数据表中的值实际上是int,那么您只需检查DBNull 并将您的数据表单元格转换为int

【讨论】:

  • 你知道为什么在Where 子句中的x 上给我一个错误吗?它说:The name 'x' does not exist in the current context.
  • @DrakeMurdoch - 哎呀。我的错。立即尝试。
  • 如果这不起作用,我该如何制作countnum = 0?因为当整列是DBnull 时,countnum 到底是什么?
  • 如果您的列全部为空值,那么countnum 将为零。因为没有单元格会通过您的Where 子句。
  • 这就是我不明白的地方。为什么,当我将我的代码更改为我在实际问题中显示的内容之外的任何内容时,它不会在所有空值上中断,但它也不会正确计算该表的任何内容?例如:for (int i = 1; i &lt; 5; i++) {float percent = Convert.ToInt32(tab2table.Compute("COUNT(Level)", "Level =" + i.ToString())); if (countnumRW &gt; 0) tab2tableExtra.Rows[i-1][2] = Math.Round(100 * percent / countnum,2);} 只输出 null
猜你喜欢
  • 1970-01-01
  • 2023-01-04
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2018-12-18
  • 2015-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多