Есть два простых способа преобразования даты из Period
класса в единый список дат. Вы можете либо расширить класс Period
, чтобы дать вам даты и использовать linq, чтобы сгладить его, либо вы прочитали оба свойства с помощью linq. Если класс SingleDate
действительно хранит дату и ничего больше, и если он не предоставляет каких-либо дополнительных функций, вы можете рассмотреть возможность просто извлечь даты.
// Test data.
var periods = new[]
{
new Period(new DateTime(2014, 01, 01), new DateTime(2014, 04, 30)),
new Period(new DateTime(2014, 05, 01), new DateTime(2014, 07, 31)),
new Period(new DateTime(2014, 08, 01), new DateTime(2014, 09, 30)),
};
Если вы можете сделать Period
класс для реализации IEnumerable<DateTime>
интерфейса и таким образом разгладить даты для вас, то простого SelectMany
может быть использован:
var result1 =
periods
// The Period class will enumerate the dates for SelectMany:
.SelectMany(x => x)
// Uncomment this line if you want to encapsulate the date.
//.Select(x => new SingleDate() { Date = x })
.ToList();
В противном случае вам нужно сглаживать Period
дату внутри SelectMany
:
var resul2 =
periods
// Here SelectMany has to enumerate the dates:
.SelectMany(x => new[]
{
x.PeriodStart,
x.PeriodEnd
})
// Uncomment this line if you want to encapsulate the date.
//.Select(x => new SingleDate() { Date = x })
.ToList();
Period
-класс, реализующий интерфейс IEnumerable<DateTime>
перечислить даты:
public class Period : IEnumerable<DateTime>
{
public Period(DateTime firstDay, DateTime lastDay)
{
this.PeriodStart = firstDay;
this.PeriodEnd = lastDay;
}
public DateTime PeriodStart { get; set; }
public DateTime PeriodEnd { get; set; }
public IEnumerator<DateTime> GetEnumerator()
{
yield return PeriodStart;
yield return PeriodEnd;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
SingleDate
-класса без изменений (не нужно, если он не дает каких-либо дополнительных функциональных возможностей):
public class SingleDate
{
public DateTime Date { get; set; }
}
Что такое 'Dates' типа? –
@FelipeOriani typo – mko
Не префикс своих классов с помощью «c»: [не использовать венгерскую нотацию.] (Http://msdn.microsoft.com/en-us/library/ms229045 (v = vs.110). aspx) – BCdotWEB