2016-11-21 47 views
1

列的绝对值之和我有下面的代码如何获得的数据表

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一个将被扣除。我需要4作为OP。我的意思是所有的abs值。怎么做?

+0

你找[Math.Abs ](https://www.dotnetperls.com/math-abs) –

回答

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保留和我们filteri NG通过)你可以把

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

编辑:在复杂的查询(见下文评论)我建议使用匿名类

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)); 
+0

是的,你是正确的。谢谢 – user1926138

+0

事实上,我有一个更复杂的情况,如下所示: 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

+0

你能帮忙吗 – user1926138

0

您可以使用LINQ

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

您可以使用LINQ这一点。

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