使用LINQ计算与上一项的差异

时间:2012-08-13 07:22:45

标签: c# linq

我有一个名为发票清单的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

有人可以建议一下最好的方法吗?

2 个答案:

答案 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()