Конечно, кто-то придумает опрятное решение LINQ, но вот мое старое решение. Конечно, у него есть проблемы, и не справится с каждой комбинацией, починил и решает эту проблему, но не элегантно никак :-(
internal class SourceData
{
public int TypeId { get; set; }
public DateTime Date { get; set; }
}
internal class Result
{
public int TypeId { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}
class Program
{
static void Main()
{
var a = new List<SourceData> {
new SourceData {TypeId = 1, Date = new DateTime(2010, 02, 01)},
new SourceData {TypeId = 1, Date = new DateTime(2010, 02, 02)},
new SourceData {TypeId = 1, Date = new DateTime(2010, 02, 03)},
new SourceData {TypeId = 2, Date = new DateTime(2010, 02, 03)},
new SourceData {TypeId = 2, Date = new DateTime(2010, 02, 04)},
new SourceData {TypeId = 2, Date = new DateTime(2010, 02, 06)}
};
var results = new List<Result>();
int currentTypeId = 1;
var rangeEndDate = new DateTime();
DateTime rangeStartDate = a[0].Date;
DateTime currentDate = a[0].Date;
for (int i = 1; i < a.Count() ; i++)
{
if (a[i].TypeId != currentTypeId)
{
results.Add(new Result() { TypeId = currentTypeId, StartDate = rangeStartDate, EndDate = rangeEndDate });
currentTypeId += 1;
rangeStartDate = a[i].Date;
}
TimeSpan tSpan = a[i].Date - currentDate;
int differenceInDays = tSpan.Days;
if(differenceInDays > 1)
{
results.Add(new Result { TypeId = currentTypeId, StartDate = rangeStartDate, EndDate = a[i-1].Date });
rangeStartDate = a[i].Date;
}
rangeEndDate = a[i].Date;
currentDate = a[i].Date;
}
results.Add(new Result { TypeId = currentTypeId, StartDate = rangeStartDate, EndDate = rangeEndDate });
Console.WriteLine("Output\n");
foreach (var r in results)
Console.WriteLine(string.Format("{0} - {1} - {2}",r.TypeId,r.StartDate.ToShortDateString(),r.EndDate.ToShortDateString()));
Console.ReadLine();
}
}
дает следующий результат: -
Выход
1 - 01/02/2010 - 03/02/2010
2 - 03/02/2010 - 04/02/2010
2 - 06/02/2010 - 06/02/2010
Как вы определяете, какова дата начала и окончания? – skyfoot
@ Начальная и конечная дата @skyfoot - это начало и конец любого диапазона дат, найденного в исходных данных. – RYFN
Но тогда не должно быть «01/02/2010 по 03/02/2010» и «03/02/2010 по 06/02/2010» – skyfoot