【问题标题】:How to get sum of absolute value of columns of data table如何获取数据表列的绝对值之和
【发布时间】:2016-11-21 08:49:37
【问题描述】:

我有以下代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Data;

namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
            //Your code goes here         
            DataTable dt = new DataTable();
            dt.Columns.Add("Column1");
            dt.Columns["Column1"].DataType = typeof(Int32);
            dt.Rows.Add(1);
            dt.Rows.Add(2);
            dt.Rows.Add(-1);
            int a = Convert.ToInt32(dt.Compute("SUM(Column1)", "Column1 < 10"));
            Console.WriteLine(a);
        }
    }
}

它将给 op 为 2,将添加 +ve no 和减去 -ve one 。我需要 4 作为 OP。我的意思是所有的绝对值。怎么做?

【问题讨论】:

标签: c# asp.net datatables


【解决方案1】:

你的问题有点含糊。想象一下你有

 -20, 1, -2 

如果您想拥有3 == 1 + |-2|(请注意,-20排除并且我们正在按绝对值进行过滤)您可以输入 linq 看起来挺直接的

var result = dt
  .AsEnumerable()
  .Select(record => Math.Abs(Convert.ToInt32(record["Column1"])))
  .Where(item => item < 10)
  .Sum();

如果您想要 23 == |-20| + 1 + |-2|(请注意,-20保留并且我们正在按进行过滤),您可以输入

var result = dt
  .AsEnumerable()
  .Select(record => Convert.ToInt32(record["Column1"]))
  .Where(item => item < 10)
  .Sum(item => Math.Abs(item));

编辑: 在复杂的查询中(见下面的 cmets)我建议使用 匿名类

var result = dt
  .AsEnumerable()
  .Select(record => new {
     Column1 = Convert.ToInt32(record["Column1"]),
     Column2 = Convert.ToString(record["Column2"]) }) 
  .Where(item => item.Column2 == "A" || item.Column2 == "B")
  .Where(item => item.Column1 < 10) 
  .Sum(item => Math.Abs(item.Column1));

【讨论】:

  • 其实我有一些更复杂的情况,比如下面的 DataTable dt = new DataTable(); dt.Columns.Add("Column1"); dt.Columns.Add("Column2"); dt.Columns["Column1"].DataType = typeof(Int32); dt.Columns["Column2"].DataType = typeof(string); dt.Rows.Add(1, "A"); dt.Rows.Add(2, "B"); dt.Rows.Add(-1, "A"); dt.Rows.Add(5, "E"); int result = Convert.ToInt32(dt.Compute("SUM(Column1)", "Column2 = 'A' OR Column2 = 'b' "));
  • 你能帮忙吗
  • @user1926138:我建议对复杂查询使用匿名类(请参阅我的编辑)。
【解决方案2】:

您可以为此使用 LINQ。

var result = dt.AsEnumerable()
                .Where(x => Convert.ToInt32(x["Column1"]) < 10)
                .Sum(x => Math.Abs(Convert.ToInt32(x["Column1"])));

【讨论】:

    【解决方案3】:

    你可以使用 LINQ

    var yourSum =dt.AsEnumerable()
        .Where( y => y.Field<int>( "Column1" )  < 10 )
        .Sum( x => x.Field<int>( "Column1" ) );
    

    【讨论】:

      猜你喜欢
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-11
      • 2012-05-21
      • 2019-11-05
      相关资源
      最近更新 更多