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()
};