包含正斜杠的数据表列的总和

时间:2014-02-26 12:07:13

标签: c# datatable

我有一个数据表列,其中包含一对由正斜杠'/'分隔的两个值(已解决/待定),例如:(10/22)

ColumnABC
---------
1/2
5/8
1/3

现在我想将此列'ColumnABC'的总和计算为(7/13)

我试过像

这样的东西
 string expression = "SUM(" + dt.Columns[i].ColumnName + ")";
 int sum = Convert.ToInt32(dt.Compute(expression, ""));

这适用于包含int值的所有其他列,但会抛出此“ColumnABC”的异常:Syntax error in aggregate argument: Expecting a single column argument with possible 'Child' qualifier.

3 个答案:

答案 0 :(得分:3)

假设您可以访问LINQ(即.NET 3.5 +):

var tuple = dt.Rows.Cast<DataRow>()
                   .Select(row => row["ColumnABC"].ToString().Split('/'))
                   .Select(strs => new Tuple<int, int>(
                         Int32.Parse(strs[0]),
                         Int32.Parse(strs[1])))
                   .Aggregate((curr, next) => new Tuple<int, int>(
                        curr.Item1 + next.Item1,
                        curr.Item2 + next.Item2));

var result = String.Format("{0}/{1}", tuple.Item1, tuple.Item2);

答案 1 :(得分:3)

首先,确认您的数据源存在明显问题。

最好的办法是在数据库中创建一个函数,将这些函数拆分为两个字段,以便返回到您的存储库。

如果您无法更改数据库架构,那么只需遍历每条记录,应用一个函数来拆分代码中的项目,或者像这样:

var resolved = dt.Rows.ToList<DataRow>.Sum(r => r[i].Split("/")[0])
var pending = dt.Rows.ToList<DataRow>.Sum(r => r[i].Split("/")[1])

无论如何,这是我的头脑......

答案 2 :(得分:1)

“int sum”毫无意义。你有一个分数(整数是整数)。我认为你将不得不迭代这些价值观或写一些非常疯狂的东西。

     DataTable table = new DataTable();
     table.Columns.Add( "fraction", typeof( string ) );
     table.Rows.Add( "1/2" );
     table.Rows.Add( "5/8" );
     table.Rows.Add( "1/3" );

     int numerator = 0;
     int denominator = 0;
     foreach ( DataRow row in table.Rows )
     {
        string[] split = row[ 0 ].ToString().Split( '/' );
        numerator += int.Parse( split[ 0 ] );
        denominator += int.Parse( split[ 1 ] );
     }
     MessageBox.Show( numerator + "/" + denominator );

将这些值存储在两个单独的列中可能更有意义,然后您可以使用标准sql轻松获取每列的总和。