Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用c中的linq计算列的总数#_C#_Linq - Fatal编程技术网

C# 使用c中的linq计算列的总数#

C# 使用c中的linq计算列的总数#,c#,linq,C#,Linq,我有一个这样的结构 ID Description Principal Interest Total 123 Paid 100 150 250 Balance 50 50 100 Total ? ? ? 124 Paid 100 150 250 Balance 50

我有一个这样的结构

ID  Description Principal   Interest    Total
123 Paid        100          150        250
    Balance     50           50         100
    Total        ?            ?           ?
124 Paid        100          150        250
    Balance     50           50         100
    Total        ?            ?           ?
类别:

public class APIBillingHistory
{
    public List<APIBillingHistoryDetails> BillingHistoryDetails;
}

public class APIBillingHistoryDetails
{
    public string BillId;
    public string Description;
    public Decimal Principal;
    public Decimal Interest;
    public Decimal Total;
}
编辑:

为了澄清我试图实现的目标:

  • 我的源记录列表不包含“总计”列和“总计”行。我想手动添加它
  • 我能够想出如何添加“Total”列,该列将包含值的总和
  • 本金
    利息
    将包含
    十进制
    格式的值
  • ID
    列是一个整数。我想显示每个
    ID
  • 本金
    利息
    的值是通过基于
    ID
    的聚合来计算的,在计算之后,只应显示
    总计

有什么建议吗?

您不能使用
Concat
并引用以前的数据。您需要使用
选择多个

BillingHistoryDetails = billingHistory.BillingHistoryDetails
    .GroupBy(detail => detail.BillId)
    .SelectMany(bg => bg.Concat(new[] { new APIBillingHistoryDetails {
        BillId = bg.First().BillId,
        Description = "Total",
        Principal = bg.Sum(b => b.Principal),
        Interest = bg.Sum(b => b.Interest),
        Total = bg.Sum(b => b.Total)
    } }));

假设当前数据

BillId描述本金利息
123支付100 150
123余额50 50
124付100 150
124余额50 50
然后,只需按标识分组,通过将分组的属性相加来创建total对象,并将描述设置为“total”

var totalsObj = new APIBillingHistory {
    BillingHistoryDetails = billingHistory.BillingHistoryDetails
           .GroupBy(detail => detail.BillId)
           .Select(g => new APIBillingHistoryDetails {
             BillId = g.Key,
             Description = "Total",
             Principal = g.Sum(detail => detail.Principal),
             Interest = g.Sum(detail => detail.Interest),
             Total = g.Sum(detail => detail.Principal) + g.Sum(detail => detail.Interest)
           }).ToList()
};
而且,
totalsObj.billinghistorydeails
将需要输出

在该计算之后,只应显示总计行

BillId说明本金利息总额
123总计150 200 350
124总计150 200 350

第二行和第三行的ID列等于什么?
十进制
怎么可能是
?是否要求和
Total
或您的意思是“Total”行不在源数据中?此外,源数据是否已包含每行的
Total
字段,还是也必须添加该字段?我建议使用名为LinqPad的工具。这类似于使用SQLServerManagementStudio,但使用的是C#实体。允许您可视化LINQ表达式的结果,并真正了解发生了什么。在我对
本金
利息
分组时,我无法避免
选择
。在做了汇总之后,我想计算每一列的总数。这在你的问题中并不明显。我认为它需要更好的编辑;例如,LINQ不“显示”任何内容。
var totalsObj = new APIBillingHistory {
    BillingHistoryDetails = billingHistory.BillingHistoryDetails
           .GroupBy(detail => detail.BillId)
           .Select(g => new APIBillingHistoryDetails {
             BillId = g.Key,
             Description = "Total",
             Principal = g.Sum(detail => detail.Principal),
             Interest = g.Sum(detail => detail.Interest),
             Total = g.Sum(detail => detail.Principal) + g.Sum(detail => detail.Interest)
           }).ToList()
};