我有一个名为发票清单的LIST,其中包含以下项目。
ID:1
Total:5
Description:Test
Date:2012-01-01
Difference:
ID:2
Total:10
Description:Test
Date:2012-02-01
Difference:
ID:3
Total:15
Description:Test
Date:2012-03-01
Difference:
ID:4
Total:20
Description:Test
Date:2012-04-01
Difference:
我需要使用LINQ(最好)计算每个发票ID之间的差异。最终输出应如下所示:
ID:1
Total:5
Description:Test
Date:2012-01-01
Difference:0
ID:2
Total:10
Description:Test
Date:2012-02-01
Difference:5
ID:3
Total:15
Description:Test
Date:2012-03-01
Difference: 5
ID:4
Total:20
Description:Test
Date:2012-04-01
Difference:5
有人可以建议一下最好的方法吗?
答案 0 :(得分:7)
我怀疑Zip
是你的朋友:
var withNull = new Invoice[] { null }.Concat(invoices);
var withDifference = withNull.Zip(withNull.Skip(1),
(x, y) => x == null ? y :
new Invoice {
ID = y.ID,
Total = y.Total,
Date = y.Date,
Difference = y.Total - x.Total
}
)
.ToList();
我会把它的工作原理(以及为什么你需要null)作为练习 - 我可以在必要时提供一些提示......
答案 1 :(得分:1)
由于源是List,您可以使用索引来引用上一个项目,这可以使用基于项目及其索引使用func的替代形式的select来实现。
var results=invoices.Select((x,i) => new Invoice {
Total = x.Total,
Date = x.Date,
Description=x.Description,
Difference = x.Total - (i==0 ? 0 : invoices[i-1].Total)}
);
如果您希望将结果作为列表
,最后可以使用.ToList()