【问题标题】:How to find the empty cells in the datatable and replace with 0如何在数据表中找到空单元格并替换为 0
【发布时间】:2016-03-04 21:54:37
【问题描述】:

我正在处理一个非常大的数据表,它有 5000 行和 8000 列。在数据表中有一些空单元格。我使用下面的代码将空单元格填充为0。但是由于数据表很大,所以速度真的很慢!!!我只想问是否有其他方法代替 for 循环。

for (int i = 0; i < SP_dt.Rows.Count; i++)
{
    for (int j = 0; j < SP_dt.Columns.Count; j++)
    {
        if (SP_dt.Rows[i][j].ToString() == "")
            SP_dt.Rows[i][j] = 0;
        Console.WriteLine("{0}  {1}",i,j);
    }

}

【问题讨论】:

  • 如果您使用 DataTable,我认为没有更快的方法。如果您的任务允许,也许您应该考虑使用 SQL?您也可以尝试删除 WriteLine - 如果您每次都调用它,它将极大地影响性能。
  • 我可以删除 console.writeline。但我认为这不会有太大帮助
  • 是WPF的WinForms吗?
  • 它是控制台应用程序
  • 这应该通过 SQL 完成。 SQL 适用于基于集合的操作,与您可以在代码端复制的任何操作相比,它的速度快如闪电(而且,它非常容易......如果您有实际的 T-SQL,COALESCE(ColumnName, 0) 是您需要的功能)

标签: c# sql sql-server datatable


【解决方案1】:

这个问题在 SQL 中比在 C# 代码中解决得更好,为您的查询创建一个存储过程,然后使用COALESCE 系统函数。

COALESCE 函数基本上会从左到右检查其参数中给出的一组元素,直到它发现它不是NULL 并返回它。这样,您可以将默认值 0 放在 COALESCE 的最后一个元素中:

create procedure spMyProc
as
begin
  select 
    COALESCE(colName1HavingNumericDataTypeToBeChecked, 0),
    COALESCE(colName2HavingNumericDataTypeToBeChecked, 0), 
    COALESCE(colNameNHavingNumericDataTypeToBeChecked, 0) 
  from tableName
end

然后在您的 C# 代码中,您只需 call that stored procedure

如果您的colName1HavingNumericDataTypeToBeChecked 不是NULL,它将返回colName1HavingNumericDataTypeToBeChecked 中的值。如果是NULL,那么它会查找下一项并找到0(不是NULL),它会返回0

【讨论】:

  • 几乎不需要存储过程...COALESCE() 也可以在任何“常规”查询中使用(也就是说,使用存储过程不一定是坏事,只是想我会指出说明它不是必需的)。
  • @jdl134679 我同意存储过程在这里不是必要,但它更有效,正如OP 所希望的那样。如果我们使用常规查询,执行计划将被创建多次——因此会增加更多的时间开销。但是如果我们使用存储过程,执行计划将只创建一次——因此效率更高。 ;)
  • 如果编译查询的结果文本在调用之间没有改变,则计划只创建一次,后续调用使用缓存计划。当然,过程确实可以保证这一点,但我的论点更多是因为 OP 显然不是 SQL 专家,存储过程的想法可能比他想要的更复杂:) 干杯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多