0

我有一个包含以下列的数据表

CallTime   CallType

15:45:00    Voice
15:30:54    Voice
00:12:14    SMS
01:13:47    Voice
05:48:23    SMS
12:00:47    Voice

现在我想要像这样使用 Linq 结果

Hrs   Count
00    1
01    1
02    0
03    0
04    0
05    1
06    0
|
|
|
12    1
13    0
|
15    2
16    0
|
|
23    0

我正在使用以下查询,它为我提供了 count > 0 的值,但我想得到那些也有 count = 0 的值

var groupQueryTimeTotal = (from r in Foundrows.AsEnumerable()
                                   let time = TimeSpan.Parse(r.Field<string>("Call Time"))
                                   group r by time.Hours
                                       into g
                                       select new
                                       {
                                           CallTime = g.Key,
                                           CallCount = g.Count(),
                                       }).OrderBy(s => s.CallTime);

这个查询给了我这样的结果

Hrs   Count
00    1
01    1
05    1
12    1
15    2
4

2 回答 2

5

执行第一个集合和第二个集合的分组连接Enumerable.Range(0, 24)Foundrows.AsEnumerable()

例子:

var input = new List<TimeSpan>
{
    new TimeSpan(15, 45, 00),
    new TimeSpan(15, 30, 54),
    new TimeSpan(00, 12, 14),
    new TimeSpan(01, 13, 47),
    new TimeSpan(05, 48, 23),
    new TimeSpan(12, 00, 47),
};

var query = from hour in Enumerable.Range(0, 24)
            join item in input on hour equals item.Hours into g
            select new
            {
                CallTime = hour,
                CallCount = g.Count(),
            };

foreach (var x in query)
{
    Console.WriteLine("{0:00} {1}", x.CallTime, x.CallCount);
}
于 2013-04-18T09:22:59.247 回答
1

像这样的东西应该可以工作:

var groupQueryTimeTotal = 
  Enumerable.Range(0, 24).Select(h => new { CallTime = h,
  CallCount = Foundrows.AsEnumerable()
  .Count(r => TimeSpan.Parse(r.Field<string>("Call Time")).Hours == h), });

当然,这确实是低效的,多次解析相同的字符串。这是一种不同的方法:

var groupQueryTimeTotal = new int[24];
foreach (var r in Foundrows)
{
  int hour = TimeSpan.Parse(r.Field<string>("Call Time")).Hours;
  ++groupQueryTimeTotal[hour];
}
于 2013-04-18T09:38:58.080 回答