2017-05-12 11 views
0

リストコレクションの1つの列を別の列に基づいて合計したいとします。2番目の列に基づいてリストの1つの列を合計

このクラスは結果がこの

Date   Payment 

2015-09-09  700 
2017-01-03  450 

コードのようにする必要があり

Date   Payment 

2015-09-09  500 
2015-09-09  200 
2017-01-03  150 
2017-01-03  300 

どのように見えるかです:私は匿名型は、それゆえ私作成する必要はありません

var result = from e in scheduleDetails 
     let k = new 
     { 
      Date = e.ActualDueDate 
     } 
     group e by k into t 
     select new 
     { 
      Date = t.Key.Date, 
      Payment = t.Sum(e => e.EscrowPayment) 
     }; 

List<ScheduleDetails> temp = result.Select(t => new ScheduleDetails(t.Date, t.Payment)).ToList(); 

元のオブジェクトにマップします。このために、コンストラクタを作成しなければなりませんでした。

public ScheduleDetails(DateTime? date, decimal? payment) 
{ 
    this.ActualDueDate = date; 
    this.EscrowPayment = payment; 
} 

質問:

  • これは、これを達成するための最良の方法ですか?

    var temp = scheduleDetails.GroupBy(sd => sd.ActualDueDate) 
           .Select(g => new ScheduleDetails(g.Key, g.Sum(sd => sd.EscrowPayment))) 
           .ToList(); 
    

    またScheduleDetailsクラスは、それはだのために公共のセッターを持っている場合:私は、結果のオブジェクトが唯一

答えて

1

あなたは新しい範囲変数と匿名型を作成する必要はありません、入力オブジェクトと同じようにしたい

  • ActualDueDateEscrowPaymentプロパティは、コンストラクタを追加することなく、オブジェクト初期化子を使用することができます。

    .Select(g => new ScheduleDetails { 
        ActualDueDate = g.Key, 
        EscrowPayment = g.Sum(sd => sd.EscrowPayment) 
    }) 
    

    クエリの構文は(ここではIEnumerable<ScheduleDetails>されることを一時に注意してください):

    var temp = from sd in scheduleDetails 
          group sd by sd.ActualDueDate into g 
          select new ScheduleDetails { 
           ActualDueDate = g.Key, 
           EscrowPayment = g.Sum(sd => sd.EscrowPayment) 
          }; 
    
  • +0

    入力が、今では10ありますが、 'ActualDueDate'と' EscrowPayment'は、すべてのレコードのためにnullで、40行を持っていました。 – Shaggy

    +0

    @Shaggyそれは不可能です。 ActualDueDateはグループ化に使用されます。グループが10つある場合、ActualDueDateには10個の異なる値が設定されています。 –

    +0

    [GroupBy](https://msdn.microsoft.com/fr-fr/library/bb549393(v=vs.110).aspx)にはあなたが直接 '選択 'できる拡張機能を持っています。これは '.GroupBy(sd => sd.ActualDueDate、(k、g)=>新しいScheduleDetails(k、g.Sum(sd => sd.EscrowPayment)))'と短縮できます。 –

    関連する問題