[英]Grouping in Linq with TimeSpan.Hours
我有一個具有以下列的數據表
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
我正在使用以下查詢,該查詢使我得到的值具有計數> 0,但我想獲得那些也具有計數= 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
執行第一個集合為Enumerable.Range(0, 24)
Foundrows.AsEnumerable()
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);
}
這樣的事情應該起作用:
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];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.