我需要帮助解决我遇到的问题。我有一个包含合同,分期付款和金额等几个字段的清单。
我需要根据这些字段创建一个新列表,当然还包括所有其他字段。
因此,对于每个分期付款的合同,我需要将金额汇总到第一期,同时保留第二期。
下面有一个例子。
这可能吗?
...contract instalment amount ...
...1 1 100 ...
...1 2 1000 ...
...2 1 100 ...
...3 1 1000 ...
...4 1 200 ...
...4 2 100 ...
...5 1 1000 ...
...contract instalment amount ...
...1 1 1100 ...
...1 2 1000 ...
...2 1 100 ...
...3 1 1000 ...
...4 1 300 ...
...4 2 100 ...
...5 1 1000 ...
答案 0 :(得分:2)
我想你想要:
var result = from record in records
group record by record.Contract into contractGroup
let orderedGroup = contractGroup.OrderBy(r => r.Instalment).ToList()
let aggregatedItem = new Record
{
Contract = contractGroup.Key,
Instalment = orderedGroup.First().Instalment,
Amount = orderedGroup.Sum(r => r.Amount)
}
from resultRecord in new[] { aggregatedItem }
.Concat(orderedGroup.Skip(1))
select resultRecord;
请注意,在您的示例中,您只处理组中包含一个或两个项目的情况,但上述代码也可以通过聚合来自所有其他项目的第一个项目来处理组中的三个或更多项目。
编辑:
既然你想改变每个组中的第一条记录而不是创建一条新记录,我会这样做:
foreach(var contractGroup in records.GroupBy(record => record.Contract))
{
// Use Aggregate or a dedicated MinBy operator
// if you don't want the sorting overhead.
var aggregateItem = contractGroup.OrderBy(record => record.Instalment)
.First();
aggregateItem.Amount = contractGroup.Sum(record => record.Amount);
}
// Now use 'records' as before as the subsequent data-source.
答案 1 :(得分:2)
您可以通过以下简单的LINQ获得结果:
var output = input.GroupBy(record => record.Contract)
.SelectMany(group =>
{
group.First().Amount = group.Sum(r => r.Amount);
return group;
})
.ToList();