【发布时间】:2011-07-01 02:48:38
【问题描述】:
我正在尝试为数据表中单个列的所有行设置相同的值,而不使用 for 循环。任何人都可以提出任何更快的方法来实现相同的目标。
【问题讨论】:
标签: .net vb.net datatable for-loop
我正在尝试为数据表中单个列的所有行设置相同的值,而不使用 for 循环。任何人都可以提出任何更快的方法来实现相同的目标。
【问题讨论】:
标签: .net vb.net datatable for-loop
除非你算上foreach,否则不会。一种或另一种方式,你需要循环。
如果您使用DataTable 版本,最快的方法是使用DataColumn 访问器,即
var col = table.Columns["Foo"];
foreach(var row in table.Rows)
row[col] = value;
作为替代方案:由于这可能与数据库有关,请手动编写 TSQL 以适当地设置所有值(即在 TSQL 中使用 合适 where 子句)。
update [theTable]
set [theColumn] = theValue
where --TODO - something sensible
【讨论】:
foreach 实际上非常快。如果它对您来说很慢,那么根本问题是您加载了太多数据。例如,通常不需要加载整个表。您可能会通过迁移到直接类型模型(而不是 DataTable)来获得改进,但无论哪种方式,这都是 O(n) - 这只是线性乘数的差异。这里的问题是n 的大小 - 与foreach 无关。
public class Customer {...} public class Order {...})而不是使用 DataTable。 DataTable 是一个通用工具 - 因此它有开销。
是的,这是可能的,即使没有循环!这可以通过Expression 属性来完成。请记住,应该引用字符串值,否则它会将其视为另一个列名。1
这将使用字符串值a 设置列“col1”:
preview.Columns["col1"].Expression = "'a'";
这将在“col1”中显示“col2”列的值:
preview.Columns["col1"].Expression = "col2";
【讨论】:
DataColumn.EvaluateExpression。它是从Expression setter 调用的。
您是否考虑过删除并重新添加具有默认值的列?
dt.Columns.Remove("FilterText")
dt.Columns.Add(New DataColumn() With {.ColumnName = "FilterText",
.DataType = GetType(String),
.DefaultValue = "Jam and chips"})
(假设您的列名是 FilterText,并且您想将其设置为“Jam andchips”)
【讨论】:
我遇到了这种类型的问题,其中使用 Select All Checkbox 将列“sel”设置为 1 或 0,foreach 循环非常慢,我从@Jonathan 的答案中得到了更快的想法,但是有一些小的修改,因为 With 子句在 c# 中不起作用
dtEmpList.Columns.Remove("sel");
dtEmpList.Columns.Add(new DataColumn("sel",typeof(bool)(chkSelectAll.Checked ? "1" : "0")));
【讨论】:
//--Adding column datatype string in C#
string strDocument = "yourStringValue";
DataColumn col = new DataColumn();
col.ColumnName = "document";
col.AllowDBNull = false;
col.DataType = typeof(string);
col.DefaultValue = strDocument ;
dr.Columns.Add(col);
【讨论】: