3

次の項目を含む送り状リストというリストがあります。

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

上記を達成するための最良の方法を提案してください。

4

2 に答える 2

8

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が必要なのか)を理解することはお任せします-必要に応じていくつかのヒントを与えることができます...

于 2012-08-13T07:40:46.110 に答える
2

ソースはリストであるため、インデックスを使用して前のアイテムを参照できます。これは、アイテムとそのインデックスの両方に基づく関数を使用する代替形式の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()結果をリストとして表示したい場合は、最後に使用できます

于 2012-08-13T07:50:41.927 に答える