C# 在linq中按时间分组(仅小时部分)
我有一个datatable,它有以下列C# 在linq中按时间分组(仅小时部分),c#,linq,time,datatable,C#,Linq,Time,Datatable,我有一个datatable,它有以下列 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 05 1 12 1 15 2 我曾尝试使用Linq进行分组,但没有得到正确的结果 我使用了以下
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
05 1
12 1
15 2
我曾尝试使用Linq进行分组,但没有得到正确的结果
我使用了以下代码
var groupQuery = from table in Foundrows.AsEnumerable()
group table by table["Call Time"] into groupedTable
select new
{
CallTime = groupedTable.Key,
CallCount = groupedTable.Count()
};
并在原始查询中使用它:
var groupQuery = from r in Foundrows.AsEnumerable()
let time = TryParse(r.Field<string>("CallTime"))
where time.HasValue
group r by time.Value.Hours into g
select new {
Hrs = g.Key,
CallCount = g.Count()
};
var groupQuery=来自Foundrows.AsEnumerable()中的r
let time=TryParse(r.Field(“CallTime”))
time.HasValue在哪里
将r组按时间.Value.Hours分为g组
选择新的{
Hrs=g.键,
CallCount=g.Count()
};
并在原始查询中使用它:
var groupQuery = from r in Foundrows.AsEnumerable()
let time = TryParse(r.Field<string>("CallTime"))
where time.HasValue
group r by time.Value.Hours into g
select new {
Hrs = g.Key,
CallCount = g.Count()
};
var groupQuery=来自Foundrows.AsEnumerable()中的r
let time=TryParse(r.Field(“CallTime”))
time.HasValue在哪里
将r组按时间.Value.Hours分为g组
选择新的{
Hrs=g.键,
CallCount=g.Count()
};
如果您想按小时分组,并且“通话时间”字段是一个日期时间
字段:
var groupQuery = from row in Foundrows.AsEnumerable()
let hour = row.Field<DateTime>("Call Time").Hour
group row by hour into hourGroup
select new {
CallHour = hourGroup.Key,
CallCount = hourGroup.Count()
};
编辑:如果它实际上是一个时间跨度
(似乎是这样),请使用lazyberezovsky的方法:)
你的:如果我想用TryParse
而不是Parse
,什么
我需要在代码中进行哪些更改
我建议创建一个允许返回可为null的扩展名,然后您可以检查HasValue==true
:
public static TimeSpan? TryGetTimeSpan(this string tsString, string format = null)
{
TimeSpan ts;
bool success;
if (format == null)
success = TimeSpan.TryParse(tsString, out ts);
else
success = TimeSpan.TryParseExact(tsString, format, null, TimeSpanStyles.None, out ts);
return success ? (TimeSpan?)ts : (TimeSpan?)null;
}
现在,此查询工作效率高,不使用未记录的side efects(作为查询中用于TimeSpan.TryParse
的本地TimeSpan
变量):
var groupQuery=来自Foundrows.AsEnumerable()中的r
let time=r.Field(“CallTime”).TryGetTimeSpan()
time.HasValue在哪里
将r组按时间.Value.Hours分为g组
选择新的
{
Hrs=g.键,
CallCount=g.Count()
};
如果您想按小时分组,并且“通话时间”字段是一个日期时间
字段:
var groupQuery = from row in Foundrows.AsEnumerable()
let hour = row.Field<DateTime>("Call Time").Hour
group row by hour into hourGroup
select new {
CallHour = hourGroup.Key,
CallCount = hourGroup.Count()
};
编辑:如果它实际上是一个时间跨度
(似乎是这样),请使用lazyberezovsky的方法:)
你的:如果我想用TryParse
而不是Parse
,什么
我需要在代码中进行哪些更改
我建议创建一个允许返回可为null的扩展名,然后您可以检查HasValue==true
:
public static TimeSpan? TryGetTimeSpan(this string tsString, string format = null)
{
TimeSpan ts;
bool success;
if (format == null)
success = TimeSpan.TryParse(tsString, out ts);
else
success = TimeSpan.TryParseExact(tsString, format, null, TimeSpanStyles.None, out ts);
return success ? (TimeSpan?)ts : (TimeSpan?)null;
}
现在,此查询工作效率高,不使用未记录的side efects(作为查询中用于TimeSpan.TryParse
的本地TimeSpan
变量):
var groupQuery=来自Foundrows.AsEnumerable()中的r
let time=r.Field(“CallTime”).TryGetTimeSpan()
time.HasValue在哪里
将r组按时间.Value.Hours分为g组
选择新的
{
Hrs=g.键,
CallCount=g.Count()
};
CallTime的类型是什么TimeSpan吗?或者CallTime是日期时间字段?如果是,您想按小时分组还是按日期+小时分组?它是字符串,但可以成功地解析为时间CallTime
is TimeSpan的类型是什么?或者CallTime是日期时间字段?如果是这样,你想按小时分组还是按日期+小时分组?它是字符串,但可以成功地按时间进行解析如果我想使用TryParse而不是Parse,我需要在代码中做什么更改?还需要在同一linq中按小时对结果进行排序query@RajeevKumar如果您有有效的时间值,那么所有这些都应该按原样工作。但如果你不这样做,请稍候,我将在minute@RajeevKumar:编辑以回答此问题。如果我想使用TryParse而不是Parse,我需要在代码中做哪些更改?还需要在同一linq中按小时对结果顺序进行排序query@RajeevKumar如果您有有效的时间值,那么所有这些都应该按原样工作。但如果你不这样做,请稍候,我将在minute@RajeevKumar:编辑以回答此问题。谢谢Tim。。蒂姆,你真的很容易。。你真的很容易
var groupQuery = from row in Foundrows.AsEnumerable()
let date = row.Field<DateTime>("Call Time")
let hour = date.Hour
group row by new{ date, hour } into dateHourGroup
select new {
CallDate = dateHourGroup.Key.date,
CallHour = dateHourGroup.Key.hour,
CallCount = dateHourGroup.Count()
};
public static TimeSpan? TryGetTimeSpan(this string tsString, string format = null)
{
TimeSpan ts;
bool success;
if (format == null)
success = TimeSpan.TryParse(tsString, out ts);
else
success = TimeSpan.TryParseExact(tsString, format, null, TimeSpanStyles.None, out ts);
return success ? (TimeSpan?)ts : (TimeSpan?)null;
}
var groupQuery = from r in Foundrows.AsEnumerable()
let time = r.Field<string>("CallTime").TryGetTimeSpan()
where time.HasValue
group r by time.Value.Hours into g
select new
{
Hrs = g.Key,
CallCount = g.Count()
};