【问题标题】:Find and replace/update specific entries from all rows of selected columns in DataTable从 DataTable 中选定列的所有行中查找和替换/更新特定条目
【发布时间】:2014-03-10 23:33:40
【问题描述】:

在 DataTable 中,我试图查找特定的字符串条目以替换它们或更新它们。

但是,它必须只针对特定的列(数据类型是字符串)。

我需要的是使用它们的名称或标题选择所有这些列,然后使用特定条件查找并替换/更新这些列的所有字符串。

例如使用名称选择列(名称在List<string>string[] 中),然后搜索字符串开头包含% 的每个字符串,并将其替换为@

类似的 SQL 尝试是 select col,replace(col,'%','@') from dtTable where col like '@%'

我试图在单个 LINQ 查询中执行此操作,但到目前为止没有成功。 LINQ 的任何示例都会有很大帮助。

【问题讨论】:

  • 你能添加一个代码示例以便更容易回答

标签: c# .net linq replace datatable


【解决方案1】:

LINQ 应该只用于查询集合而不是修改它们。使用简单的循环和DataRow.Field + DataRow.SetField,它们是强类型并支持空值:

List<string> colsToUpdate = new List<string> { "Column1", "Column2", "..." };
foreach (DataRow row in table.Rows)
{
    foreach (String colName in colsToUpdate)
    {
        string oldValue = row.Field<string>(colName);
        if(oldValue.StartsWith("%"))
            row.SetField(colName, "@" + oldValue.Substring(1));
    }
}

【讨论】:

  • 确实,我同意。在将这些字符串插入 DataTable 时,我已经这样做了。但是,为每个条目执行此过程会慢一些(要加载大量数据)。这就是为什么我一直在寻找可以一次性做到这一点的东西,就像我们对单个列使用 SQL 查询一样。 select col,replace(col,'%','@') from dtTable where col like '@%'
  • @ChP:这是更新已填写的DataTable 的最有效方法。当然,首先避免无效数据总是更有效,例如通过使用不同的 sql(如果数据来自数据库)。我怀疑你试图在错误的地方进行优化。
  • 谢谢,没错。我可以尝试分别对每一列执行此操作(如果可以一次性替换所有条目)。或者,您提到的过程运行良好,或者我可以在加载数据本身时继续我正在做的事情。实际上,这些数据来自 API,我无法控制。
  • @ChP:你可以相信我,因为我是 LINQ 的忠实粉丝。在这种情况下,每种 LINQ 方法的效率都会降低、可读性降低且可维护性也会降低。 linq 查询根本不应该有副作用,而您同时枚举的DataTable 修改就是其中之一。因此,您必须创建一个空白的新 DataTable 才能使用 LINQ 解决此问题。但是,即使您必须初始化 DataRows,这对于 LINQ 来说还是很困难的。最后,LINQ 在底层也使用了循环。
  • 哇,我想现在更清楚了,我们使用的方法是正确的,最好验证正在加载的数据,如 null 或空或空格等。如果我们真的在它上面强制使用 LINQ,那实际上会降低这种情况下的性能,因为这将是一种解决方法。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 2012-11-02
  • 2021-06-26
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多