C#LINQ to Objects:Group By / Sum帮助

在事务对象列表中,我尝试按BatchNo进行分组,然后对Amounts进行求和.
public class Extract
{
    // Notable fields in TRANSACTION are: String mBatchNo,String mAmount
    private List<Transaction> Transactions;

    public void testTransactions()
    {

        // Sum of amounts grouped by batch number
        var sGroup = from t in Transactions
                     group t by t.mBatchNo into g
                     select new { batchNo = g.Key,totalAmount = g.Max(a => (Int32.Parse(a.mAmount)))};
    }
}

此时,我通过locals窗口进入代码查看,看看我的结果集是针对我导入到此对象的文件进行检查的.

文件中的最后一批有3条记录,每条记录100个,可以看到钻入到事务列表对象中.但是向下钻取到sGroup结果会发现同一批次总数为100(应为300).我在这查询中搞砸了什么?

请注意,我已将其存储为字符串,因为我们在8字符字段的左侧填零.出于出口原因,我决定将其存储为字符串.虽然这可以(也可能会)改变,但它没有回答我的问题:如何使这个查询通过BatchNo将总和聚合成集合?

解决方法

您需要拨打 Sum而不是 Max
var sGroup = from t in Transactions
    group t by t.mBatchNo into g
    select new {
        batchNo = g.Key,totalAmount = g.Sum(a => (int.Parse(a.mAmount))) // Sum,not Max
    };

我还建议,如果您的mAmount字段存储为字符串,则使用比int.Parse更强大的方法(因为如果字符串不是有效整数,例如,如果它是空白的话,那将抛出异常).像这样的东西:

int ParSEOrZero(string text)
{
    int value;
    if (int.TryParse(text,out value))
        return value;
    else
        return 0;
}

var sGroup = from t in Transactions
    group t by t.mBatchNo into g
    select new {
        batchNo = g.Key,totalAmount = g.Sum(ParSEOrZero) // blanks will be treated as 0
    };

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...