【问题标题】:Set value for all rows in a datatable without for loop在没有 for 循环的情况下为数据表中的所有行设置值
【发布时间】:2011-07-01 02:48:38
【问题描述】:

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

【问题讨论】:

    标签: .net vb.net datatable for-loop


    【解决方案1】:

    除非你算上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 运行良好,并且已经在运行,但速度非常慢。我的问题是 Foreach 构造的缓慢。
    • @Soham foreach 实际上非常快。如果它对您来说很慢,那么根本问题是您加载了太多数据。例如,通常不需要加载整个表。您可能会通过迁移到直接类型模型(而不是 DataTable)来获得改进,但无论哪种方式,这都是 O(n) - 这只是线性乘数的差异。这里的问题是n 的大小 - 与foreach 无关。
    • 你能具体说明一下你所说的直接类型模型是什么意思吗?
    • @soham 使用特定的类(即public class Customer {...} public class Order {...})而不是使用 DataTable。 DataTable 是一个通用工具 - 因此它有开销。
    • “不管怎样,你需要循环。”。这不是真的,请看我下面的帖子
    【解决方案2】:

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

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

    preview.Columns["col1"].Expression = "'a'";
    

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

    preview.Columns["col1"].Expression = "col2";
    

    【讨论】:

    • 值得一提的是,即使这种方法也使用了循环。它只是对开发人员隐藏,位于DataColumn.EvaluateExpression。它是从Expression setter 调用的。
    【解决方案3】:

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

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

    (假设您的列名是 FilterText,并且您想将其设置为“Jam andchips”)

    【讨论】:

      【解决方案4】:

      我遇到了这种类型的问题,其中使用 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")));
      

      【讨论】:

        【解决方案5】:
        //--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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-01
          • 1970-01-01
          • 2020-12-20
          • 1970-01-01
          • 2019-09-02
          • 2021-11-18
          • 2018-11-02
          • 2013-09-20
          相关资源
          最近更新 更多