Я думаю, что вы, возможно, слишком усложняете решение, основываясь на том, что я думаю, вы пытаетесь сделать. В конечном итоге было бы здорово написать небольшой класс для обработки такого типа структуры данных, в котором вы хотите агрегировать даты на основе года и месяца.
Я предполагаю, что вы хотите оставить пустые годы / месяцы или что в вашем диапазоне дат вряд ли будут пробелы. Вы также заметите, что я использую IQueryable, а не IEnumerable.
В основном вам нужно различать годы в вашем диапазоне, а затем различать месяцы в каждом из этих лет. Итак, учитывая этот набор данных:
List<DateTime> dateRange = new List<DateTime>();
dateRange.Add(new DateTime(2009, 5, 18));
dateRange.Add(new DateTime(2009, 5, 12));
dateRange.Add(new DateTime(2009, 6, 22));
dateRange.Add(new DateTime(2009, 2, 14));
dateRange.Add(new DateTime(2009, 11, 23));
dateRange.Add(new DateTime(2010, 5, 2));
dateRange.Add(new DateTime(2010, 7, 17));
dateRange.Add(new DateTime(2010, 7, 10));
dateRange.Add(new DateTime(2009, 11, 28));
dateRange.Add(new DateTime(2009, 11, 16));
dateRange.Add(new DateTime(2010, 1, 30));
dateRange.Add(new DateTime(2010, 3, 1));
dateRange.Add(new DateTime(2010, 9, 23));
dateRange.Add(new DateTime(2010, 5, 1));
dateRange.Add(new DateTime(2010, 9, 4));
ViewData["range"] = dateRange.AsQueryable();
Вы можете выполнить итерацию по вашему мнению, выполнив:
<% var range = ViewData["range"] as IQueryable<DateTime>; %>
<% foreach (var year in range.Select(x=>x.Year)
.Distinct()
.OrderBy(x=>x))
{ %>
<ul>
<li><%=year %>
<ul>
<% foreach (var month in range.Where(x=>x.Year==year)
.OrderBy(x=>x.Month)
.Select(x=>x.Month)
.Distinct()) { %>
<li><%=(new DateTime(1900,month,1)).ToString("MMMM") %>
<ul>
<% foreach (var day in range.Where(x => x.Year == year && x.Month == month))
{ %>
<li>
<%=day.ToLongDateString() %>
</li>
<% } %>
</ul>
</li>
<% } %>
</ul>
</li>
</ul>
В идеале вы просто хотите использовать методы расширения или класс-обертку, чтобы вы могли сделать:
foreach(var year in range.DistinctYears())
Месяцы, которые оборачивают английский формат вокруг целочисленного значения, тоже были бы хорошими.
Посмотрите, как это работает для вас.