首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要C#逻辑方面的帮助

需要C#逻辑方面的帮助
EN

Stack Overflow用户
提问于 2010-09-01 00:20:21
回答 4查看 251关注 0票数 0

我有一个包含以下字段的表格,

代码语言:javascript
复制
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,它可以显示每小时所有天的演出次数。

代码语言:javascript
复制
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的逻辑吗?

因为我想要显示每个日期的所有小时和它们的计数,我是否必须使用日期列表框,并在另一个列表框中显示该日期中的所有小时和计数?你能告诉我如何做到这一点吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-09-01 01:44:01

假设您能够使用LINQ,那么您可以相当容易地在C#中完成所有的分组和排序。(我假设只有DateTime对象的列表,而不是完整的Show对象--看起来您可以通过一个简单的LINQ Select语句获得每个Show的DateTime。)

代码语言:javascript
复制
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());
}

这将提供以下输出:

代码语言:javascript
复制
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格式示例。

代码语言:javascript
复制
<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更容易连接。这段代码在我的测试窗口的构造函数中。

代码语言:javascript
复制
    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;
票数 4
EN

Stack Overflow用户

发布于 2010-09-01 00:24:47

大多数数据库都有转换功能。例如,与SQL Server类似,您可以转换日期并对其进行格式化,使其在convert关键字中显示为7/29/2010。此外,您可以使用SQL中的datepart函数来提取第一个小时(除非小时是12,否则必须通过添加1来计算第二个小时,然后返回1,这可以通过一个函数来完成)。

所以按日期分组,然后按小时范围分组,然后计算出现的次数...是逻辑上的。

HTH。

票数 3
EN

Stack Overflow用户

发布于 2010-09-01 00:24:59

至于您的解析问题,因为7/29/2010 8:55:00 AM是一个有效的DateTime,所以您可以只使用DateTime

代码语言:javascript
复制
System.DateTime dateTime;
System.DateTime.TryParse("7/29/2010 8:55:00 AM", out dateTime);
var date = dateTime.Date;
var time = dateTime.TimeOfDay;

还可以使用各种其他属性和方法。如果你只是想要字符串,你可以使用

代码语言:javascript
复制
var timeString = dateTime.ToString("hh:mm");

在C#中,如果您使用的是日期、数字、时间等“普通”类型的数据,那么您几乎不需要进行字符串操作

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3611039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档