【问题标题】:Multiply all the rows from an entire column from a DataTable将 DataTable 中整列的所有行相乘
【发布时间】:2017-08-01 13:23:10
【问题描述】:

我有一个包含几列的 DataTable。我只需要将整列 0 乘以一个常数值。就我而言,我正在将此列从 Giga (10^9) 转换为 Kilo (10^3)​​。换句话说,

  • 我需要将第 0 列中的每个值乘以 10^6。

(我想更改一个特定列中的所有行。)

我有什么:

    // change the freq. unit (from Giga (10^9) to Kilo(10^3))
    foreach (DataRow row in csvData.Rows)
    {
            row.SetField(0, 9999);
    }

如您所见,在这种情况下,我只是将索引为 0 的列中的所有内容设置为“9999”。如何更改以获取列的值,然后乘以 10^6?

想法(不工作):

  1. 取自here

        foreach (DataRow row in csvData.Rows)
        {
            foreach (DataColumn column in csvData.Columns[0])
            {
                row.SetField(column, column * 100000);
            }
        }
    

错误:

csvData.Columns[0]) - foreach 语句无法对“System.Data.DataColumn”类型的变量进行操作,因为“System.Data.DataColumn”不包含“GetEnumerator”的公共定义

列 * 100000); - 运算符 * 不能应用于“DataColumn”和“int”类型的操作数

【问题讨论】:

  • csvData.Columns[0] 表示数据表的第一列。您不能将其用作 foreach 循环中的集合。您想更改特定列的值或多个列?
  • 尝试以下操作:foreach(DataRow row in csvData.AsEnumerable()) { row.SetField(0, row.Field(0) * 1000); }
  • @ChetanRanpariya,我想更改一个特定列中的所有行。
  • 所以假设你想将第一列的值乘以 100000 那么你应该删除内部 foreach 循环并写row.SetField(0, Convert.ToInt32(row[0]) * 100000);
  • 嘿@jdweng,如果我这样尝试,我会收到错误“System.Data.DataSetExtensions.dll 中发生'System.InvalidCastException' 类型的未处理异常”

标签: c# datatable


【解决方案1】:

使用@ChetanRanpariya 在问题的 cmets 中提供的想法,我能够像这样解决我的问题:

    foreach (DataRow row in csvData.Rows)
    {
        row.SetField(0, Convert.ToDouble(row[0]) * 100000);
    }

旁注:我从“Convert.ToInt32”更改为“Conver.ToDouble”,因为我的列包含带点的数字。

【讨论】:

    【解决方案2】:

    由于您只更改一列的值,因此您只需要一个 foreach 循环(循环遍历行)。

    您所要做的就是遍历行,读取列的值,然后重写。

    foreach (DataRow row in csvdata.Rows) {
        row.SetField(0, row.Field(0) * 1000000);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      相关资源
      最近更新 更多