【问题标题】:sum of datatable column containing forward slash包含正斜杠的数据表列的总和
【发布时间】:2014-02-26 12:07:12
【问题描述】:

我有一个数据表列,其中包含一对由正斜杠“/”分隔的两个值(已解决/待处理),例如:(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.

【问题讨论】:

    标签: c# datatable


    【解决方案1】:

    假设您可以访问 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);
    

    【讨论】:

    • 谢谢@decPL !!由于列名是动态的并且是未知的,因此我不得不对您的代码进行轻微更改: .Select(row => row[dt.Columns[i].ColumnName].ToString().Split('/'))跨度>
    【解决方案2】:

    首先,承认您的数据源显然存在问题。

    最好的办法是在数据库中创建一个函数,将它们分成两个字段,然后返回到您的存储库。

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

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

    不管怎样,这不是我的想法......

    【讨论】:

    • @decPL 的回答与此类似,但要优雅得多,并且在我之前就进入了。威士忌和编码建议!FTW。
    • 我喜欢这两个答案。你的将字符串拆分加倍,但更容易阅读。
    【解决方案3】:

    “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 轻松获得每列的总和。

    【讨论】:

    • 他想将斜线之前的所有项目相加,然后将斜线之后的所有项目相加。斜杠用作分隔符,而不是除法运算符。
    • 好的。好吧,一旦他分别拥有这两个数字,他就可以做任何他想做的事:) 但你说得很好,所以我将删除关于如何划分这两个数字的行。
    猜你喜欢
    • 2018-02-10
    • 2018-06-29
    • 2018-09-21
    • 1970-01-01
    • 2016-11-19
    • 2016-12-12
    • 2021-03-27
    • 2021-05-29
    • 2015-03-13
    相关资源
    最近更新 更多