【问题标题】:How to add only numeric numbers in a column C#如何在列C#中仅添加数字
【发布时间】:2019-02-25 18:18:27
【问题描述】:

我想在 C# 中获取 DataTable 列的总和。但是,我的列由字符串和数值组成。有没有办法只总结列中找到的数值?

数据表

Column

hello
304
-312
213
bye

我已尝试使用下面的代码,但当单元格不是数值时,它将不起作用。

var total = dt.Compute("Sum(column)","");

【问题讨论】:

  • 这是从哪个数据库读取的?
  • 为什么不使用累加器和sum += decimal.TryParse(dt["Column"][i].ToString(), out var value) ? value : 0 读取行并解析所有字符串数据?

标签: c# oledb oledbconnection oledbdatareader


【解决方案1】:

我认为您不能在 Compute 中使用强制转换,因此解决方案可能是这样的(VB.net 代码):

Dim dt As New DataTable
dt.Columns.Add("test")

dt.Rows.Add("hello")
dt.Rows.Add("304")
dt.Rows.Add("-312")
dt.Rows.Add("213")
dt.Rows.Add("bye")

Dim intTotal As Integer = 0

For Each dr As DataRow In dt.Rows

    Dim intValue As Integer = 0

    If Integer.TryParse(dr("test"), intValue) Then
        intTotal += intValue
    End If

Next dr

MsgBox(intTotal)

【讨论】:

  • 同意,如果 DB 设计得如此糟糕以至于它包含文本和数据信息的混合,最好手动完成
  • 感谢您的回答,它运作良好!但是它在 VB.net 中,所以我会接受 C# 代码中的那个。
【解决方案2】:
decimal sum;
for (i=0;i<rows;i++)
{
  sum += decimal.TryParse(dt["Column"][i].ToString(), out var value) ? value : (decimal)0L;
}

【讨论】:

    【解决方案3】:

    C# 示例

    Datatable dt = new DataTable()
    dt.Columns.Add("test")
    dt.Rows.Add("test2")
    dt.Rows.Add("45")
    dt.Rows.Add("12")
    dt.Rows.Add("-213")
    dt.Rows.Add("test3")
    
    int total = 0
    
    Foreach(DataRow dr in dt.Rows) {
        If (Integer.TryParse(dr("test")){
            total += dr("test").value)
        }
    }
    
    return total;
    

    【讨论】:

      【解决方案4】:

      Compute 方法允许类型转换。

      var sum = dt.Compute("Sum(Convert(column, 'System.Int32'))");
      

      您也可以使用 LINQ:

      int sum = dt.Rows.Select(dr=>(int)dr["column"]).Sum();
      

      欲了解更多信息:MSDN

      【讨论】:

      • 如果有人将双精度或浮点数和整数数据库放在一起怎么办?
      • int sum = dt.Rows.Select(dr=&gt;(int)dr["column"]).Sum(); 将引发字符串数据异常,不能隐式转换为 int
      猜你喜欢
      • 2022-08-03
      • 1970-01-01
      • 2011-05-12
      • 2016-03-02
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多