我有一个包含以下字段的表格,
table Shows,
Id Name Time
1 A 7/28/2010 11:15:00 AM
2 B 7/29/2010 8:50:00 AM
3 C 7/29/2010 8:55:00 AM我有一个对象显示,它有来自所有字段的数据。现在我想要一个UI,它可以显示每小时所有天的演出次数。
Date 7/28/2010
Hours Count
11-12 1
Date 7/29/2010
Hours Count
8-9 2我不知道我该如何在C#中做到这一点(逻辑)。另外,在C#中,有没有像php那样的爆炸函数。因为我的数据库字段的值是7/29/2010 8:55:00AM,而我想要中断日期和时间。有人可以帮助构建上述UI的逻辑吗?
因为我想要显示每个日期的所有小时和它们的计数,我是否必须使用日期列表框,并在另一个列表框中显示该日期中的所有小时和计数?你能告诉我如何做到这一点吗?
发布于 2010-09-01 01:44:01
假设您能够使用LINQ,那么您可以相当容易地在C#中完成所有的分组和排序。(我假设只有DateTime对象的列表,而不是完整的Show对象--看起来您可以通过一个简单的LINQ Select语句获得每个Show的DateTime。)
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),因此我将把获取分组结果并将其应用于图形用户界面作为练习。
编辑:这是一个使用嵌套ItemsControls和DataBinding to a LINQ语句的XAML格式示例。
<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;发布于 2010-09-01 00:24:47
大多数数据库都有转换功能。例如,与SQL Server类似,您可以转换日期并对其进行格式化,使其在convert关键字中显示为7/29/2010。此外,您可以使用SQL中的datepart函数来提取第一个小时(除非小时是12,否则必须通过添加1来计算第二个小时,然后返回1,这可以通过一个函数来完成)。
所以按日期分组,然后按小时范围分组,然后计算出现的次数...是逻辑上的。
HTH。
发布于 2010-09-01 00:24:59
至于您的解析问题,因为7/29/2010 8:55:00 AM是一个有效的DateTime,所以您可以只使用DateTime
System.DateTime dateTime;
System.DateTime.TryParse("7/29/2010 8:55:00 AM", out dateTime);
var date = dateTime.Date;
var time = dateTime.TimeOfDay;还可以使用各种其他属性和方法。如果你只是想要字符串,你可以使用
var timeString = dateTime.ToString("hh:mm");在C#中,如果您使用的是日期、数字、时间等“普通”类型的数据,那么您几乎不需要进行字符串操作
https://stackoverflow.com/questions/3611039
复制相似问题