Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在linq中按时间分组(仅小时部分)_C#_Linq_Time_Datatable - Fatal编程技术网

C# 在linq中按时间分组(仅小时部分)

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进行分组,但没有得到正确的结果 我使用了以下

我有一个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进行分组,但没有得到正确的结果

我使用了以下代码

   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()
                 };