2015-07-10 33 views
1

我是linq的新手,並且在網上閱讀了關於它們的一些內容。將foreach轉換爲linq來解決運行平衡

現在,下面是一個查詢工作正常,從當前日期計算項目12個月的運行餘額。是否有可能將此轉換爲linq?

這會幫助我更好地理解linq。

var firstDayMonth = new DateTimeOffset(new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1)); 
    var months = Enumerable.Range(0, 12) 
          .Select(m => firstDayMonth.AddMonths(m)); 

    List<SomeDate> SomeDates = new List<SomeDate>() 
    { 
     new SomeDate { Id = 7, Month = firstDayMonth.AddMonths(0), Balance = 1m }, 
     new SomeDate { Id = 7, Month = firstDayMonth.AddMonths(0), Balance = 3m }, 
     new SomeDate { Id = 8, Month = firstDayMonth.AddMonths(1), Balance = 6m }, 
     new SomeDate { Id = 8, Month = firstDayMonth.AddMonths(1), Balance = 5m }, 
     new SomeDate { Id = 8, Month = firstDayMonth.AddMonths(1), Balance = 3m }, 
     new SomeDate { Id = 9, Month = firstDayMonth.AddMonths(2), Balance = 5m }, 
     new SomeDate { Id = 10, Month = firstDayMonth.AddMonths(3), Balance = 3m }, 
     new SomeDate { Id = 12, Month = firstDayMonth.AddMonths(5), Balance = 15m }, 
     new SomeDate { Id = 13, Month = firstDayMonth.AddMonths(6), Balance = 16m }, 
     new SomeDate { Id = 13, Month = firstDayMonth.AddMonths(6), Balance = 12m }, 
    }; 

    var projected12MonthsBalance = new List<SomeDate>(); 

    foreach(var month in months) 
    { 
     projected12MonthsBalance.Add(new SomeDate { Month = month, Balance = SomeDates.TakeWhile(s => s.Month <= month).Sum(s => s.Balance) }); 
    } 

    Console.WriteLine(projected12MonthsBalance); 

public class SomeDate 
{ 
    public int Id { get; set; } 
    public DateTimeOffset Month { get; set; } 
    public decimal Balance { get; set; } 
} 
+0

值得一提的是'如果你是確保集合按月訂購TakeWhile'的偉大工程,但'Where'可能會更好,如果你不確定收集訂單。 – christophano

+0

@christophano我明白了。非常感謝你的提示 –

回答

2

試試這個:

var projected12MonthsBalance = months.Select(x => new SomeDate 
{ 
    Month = x, 
    Balance = SomeDates.TakeWhile(s => s.Month <= x).Sum(s => s.Balance) 
}).ToList();