2016-04-21 2 views
0

Ich habe eine Situation, in der ich eine Reihe von Daten, die sich über mehrere Tage erstreckt, in mehrere Objekte konvertieren möchte.Linq drehen Sie eine Zeile in mehrere, wenn das Datum mehrere Tage umfasst

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

Für die Ausgabe dieses Ich möchte:

Als erste Reihe erstreckt sich über zwei Tage, die ich

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

Hoffnung das macht Sinn für Row1 zwei Reihen wollen?

Antwort

0

Sie können die Linq-Abfrage in Create an array or List of all dates between two dates skizzierte verwenden.

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()); 

Um diese Arbeit zu machen, herausgegeben ich die Definition von Artikel zu sein, wie folgt:

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

Sie es in Aktion bei https://dotnetfiddle.net/XIfMmr sehen können. Beachten Sie, dass das Ergebnis etwas anders als gewünscht ist, da DateTime.Now.AddDays(2) immer 3 Tage umfassen wird.

+0

Genau was ich wollte –

0

Sie könnten versuchen, Item.ToString() zu überschreiben.

z.B.

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

prüfen here

Verwandte Themen