Предполагая, что вы можете использовать LINQ, вы можете довольно легко выполнить всю группировку и упорядочение в C #. (Я предполагаю, что это просто список объектов DateTime, а не полных объектов Show. Похоже, вы можете получить DateTime для каждого Show с помощью простого оператора LINQ Select.)
var shows = new[]
{
new DateTime(2010, 7, 28, 11, 15, 0),
new DateTime(2010, 7, 29, 8, 50, 0),
new DateTime(2010, 7, 29, 8, 55, 0)
};
var dates = shows.GroupBy(d => d.Date).OrderBy(d => d.Key);
foreach (var date in dates)
{
Console.WriteLine("Date {0}", date.Key.ToShortDateString());
var hours = date.GroupBy(d => d.Hour).OrderBy(d => d.Key);
Console.WriteLine("\tHours\tCount");
foreach (var hour in hours)
Console.WriteLine("\t{0}-{1}\t{2}", hour.Key, (hour.Key+1)%24, hour.Count());
}
Это обеспечивает вывод:
Date 7/28/2010
Hours Count
11-12 1
Date 7/29/2010
Hours Count
8-9 2
Обратите внимание, что это простой пример консольного приложения. Вы не указали, какую технологию графического интерфейса вы используете (WinForms, WPF), поэтому я оставлю это в качестве упражнения, чтобы взять результаты группировки и применить их в графическом интерфейсе.
Редактировать: вот пример формата в XAML с использованием вложенных ItemsControls с привязкой DataBinding к оператору LINQ.
<ItemsControl Name="ShowDates" ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<HeaderedContentControl HeaderStringFormat="Date: {0}">
<HeaderedContentControl.Header>
<StackPanel>
<TextBlock Text="{Binding Path=DateString, StringFormat='Date: {0}'}" />
<TextBlock Margin="20,1,1,1" Text="Hour : Shows"/>
</StackPanel>
</HeaderedContentControl.Header>
<ItemsControl Name="HoursList" Margin="20,1,1,1" ItemsSource="{Binding Path=Hours}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0}-{1} : {2}">
<MultiBinding.Bindings>
<Binding Path="HourStart" />
<Binding Path="HourEnd" />
<Binding Path="Count" />
</MultiBinding.Bindings>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</HeaderedContentControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
При этом используется измененная версия моего исходного оператора LINQ, чтобы упростить подключение DataBinding. Этот код находится в конструкторе моего тестового окна.
var result =
shows
.GroupBy(d => d.Date)
.Select(gp => new{
Date = gp.Key,
DateString = gp.Key.ToShortDateString(),
Hours = gp.GroupBy(d => d.Hour)
.Select(hgp => new {
HourStart = hgp.Key,
HourEnd = (hgp.Key + 1) % 24,
Count = hgp.Count()
})
.OrderBy(h => h.HourStart)
});
ShowDates.DataContext = result;