2016-04-21 49 views
0

我有一種情況,我想將跨越多天的一行數據轉換爲多個對象。如果日期跨越多天,Linq會將一行變爲多個

namespace Linq 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var item = new List<Item> 
      { 
       new Item {StartDate = DateTime.Now, EndDate = DateTime.Now.AddDays(2)}, 
       new Item {StartDate = DateTime.Now, EndDate = DateTime.Now.AddMinutes(120)} 
      }; 
     } 
    } 
} 

public class Item 
{ 
    public DateTime StartDate { get; set; } 
    public DateTime EndDate { get; set; } 
} 

對於輸出,我想這樣的:

作爲第一行跨越兩天我想兩行ROW1

Row1, 21/04/2016 
Row1, 22/04/2016 
Row2, 21/04/2016 

希望這是有道理的?

回答

0

您可以使用Create an array or List of all dates between two dates概述LINQ查詢。

var results = items.SelectMany(i => 
     Enumerable.Range(0, 1 + i.EndDate.Subtract(i.StartDate).Days) 
     .Select(offset => new { id = i.id, date = i.StartDate.AddDays(offset).Date}) 
     .ToArray()); 

爲了使這項工作,我編輯項目的定義如下:

public class Item 
{ 
    public int id; 
    public DateTime StartDate { get; set; } 
    public DateTime EndDate { get; set; } 
} 

您可以在https://dotnetfiddle.net/XIfMmr看到它的行動。請注意,結果與您所期望的結果稍有不同,因爲DateTime.Now.AddDays(2)將始終跨越3天。

+0

正是我之後 –

0

你可以嘗試重寫Item.ToString()。

例如

public override string ToString() 
{ 
    var endDateStr = StartDate.Date != EndDate.Date 
     ? Environment.NewLine + EndDate.ToShortDateString() 
     : string.Empty; 
    return string.Format("{0}{1}", StartDate.ToShortDateString(), endDateStr); 
} 

檢查here