2017-05-12 75 views
0

我想基於另一列在列表集合中總結一列。根據第二列在列表中總結一列

這是一流的樣子

Date   Payment 

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

結果應該是這樣的

Date   Payment 

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

代碼:

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; 
} 

問題:

  • 這是實現這一目標的最佳方式是什麼?
  • 我想要得到的對象是一樣的輸入對象只

回答

1

你並不需要創建新的範圍變量和匿名類型:

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

此外,如果ScheduleDetails類具有公共setter方法是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

輸入有40行,現在有10個,但'ActualDueDate'和'EscrowPayment'是空的所有記錄。 – Shaggy

+0

@Shaggy這是不可能的。 ActualDueDate用於分組。如果您有10個組,則ActualDueDate中應有10個不同的值,結果爲 –

+0

[GroupBy](https://msdn.microsoft.com/fr-fr/library/bb549393(v = vs.110).aspx)has有一個擴展名,可以讓你直接選擇。這可以縮短爲'.GroupBy(sd => sd.ActualDueDate,(k,g)=>新的ScheduleDetails(k,g.Sum(sd => sd.EscrowPayment)))''。 –

相關問題