为没有for循环的数据表中的所有行设置值

Soh*_*pta 9 .net vb.net datatable for-loop

我正在尝试为数据表中的单个列设置所有行的相同值,而不使用for循环.任何人都可以建议任何更快的方法来实现相同.

Jul*_*ian 15

是的,这是可能的,即使没有循环!这可以通过Expression财产来完成.请记住,应该引用字符串值,否则它会将其视为另一个列名.1

这将使用字符串值设置列'col1' a:

preview.Columns["col1"].Expression = "'a'";
Run Code Online (Sandbox Code Playgroud)

这将在'col1'中显示'col2'列的值:

preview.Columns["col1"].Expression = "col2";
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是,即使这种方法也使用循环.它只是隐藏在开发人员身上,位于[`DataColumn.EvaluateExpression`](http://referencesource.microsoft.com/#System.Data/System/Data/DataTable.cs,d3b24c1951b112d9,references).它是从`Expression` setter调用的. (5认同)

Mar*_*ell 10

除非算上,否则不会foreach.无论如何,你需要循环.

如果您使用该DataTable版本,最快的方法是使用DataColumn访问者,即

var col = table.Columns["Foo"];
foreach(var row in table.Rows)
    row[col] = value;
Run Code Online (Sandbox Code Playgroud)

作为替代方案:因为这可能与数据库有关,所以手动编写TSQL以适当地设置所有值(即在TSQL中使用合适的 where子句).

update [theTable]
set [theColumn] = theValue
where --TODO - something sensible
Run Code Online (Sandbox Code Playgroud)

  • @Soham`foreach`实际上非常快.如果它对你来说很慢,那么根本问题是你已经加载了太多的数据**.例如,通常不需要加载整个表.你可以通过转向直接类型模型(而不是`DataTable`)来获得改进,但无论哪种方式都是"O(n)" - 它只是线性乘数的差异.这里的问题是`n`的大小 - 与`foreach`无关. (3认同)

Jon*_*han 7

您是否考虑过删除并重新添加具有默认值的列?

dt.Columns.Remove("FilterText")
dt.Columns.Add(New DataColumn() With {.ColumnName = "FilterText",
                                      .DataType = GetType(String),
                                      .DefaultValue = "Jam and chips"})
Run Code Online (Sandbox Code Playgroud)

(假设您的列名是 FilterText,并且您想将其设置为“果酱和薯条”)