从linq到sql的开始结束时间列表的平均时间

时间:2013-07-25 08:59:47

标签: c# linq timespan

我有一个

列表
*startTime    (datetime)
*endTime      (datetime)

并且需要计算列表中所有内容的平均时间。

所以我猜我需要像

这样的东西
long averageTime = 
 Convert.ToInt64(listOfStartEndTimes.Average(timeSpan => timeSpan.Ticks))

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

long averageTime = listOfStartEndTimes
                       .Select(se => se.End - se.Start)
                       .Average(t => t.Ticks);

或者,分辨率稍低(unix纪元日期):

long averageTime = listOfStartEndTimes
                       .Select(se => se.End - se.Start)
                       .Average(t => (t.Ticks – 621355968000000000) / 10000000);

答案 1 :(得分:2)

其他答案是正确的,您可以使用简单的LINQ平均TimeSpan属性。我更喜欢让TimeSpan课程来确定精确度,例如Uffe表示。但请确保您使用的是正确的属性。 .Seconds将返回不符合整分钟的余数。您需要.TotalSeconds属性。

使用.Ticks可能很有诱惑力,但如果你有很多价值并且彼此之间的距离足够远,你可以轻松获得OverflowException。我的建议是在结果中使用比您需要的小一个单位。因此,如果您关心分钟的平均精度,那么.TotalSeconds应该可以正常工作。然后,如果您愿意,可以将结果恢复为TimeSpan

var sec = yourList.Select(p => p.Stop - p.Start).Average(p => p.TotalSeconds);
var avg = TimeSpan.FromSeconds(sec);

此外,由于您的StartStop值属于DateTime类型,因此您确实需要关注他们的.Kind。只有yourDateTime.Kind == DateTimeKind.Utc才能保证这样的操作准确无误。

如果它们是Local种,则结果将受运行代码的本地计算机的时区影响。如果它们是Unspecified,则数据可能已记录在本地时区或某个其他时区的上下文中。如果您正在工作的时间涵盖夏令时转换,那么您的减法结果可能不正确。

例如,如果您在美国太平洋时区运行此代码,并且Local种类型为DateTime,那么减去2013-11-03 06:00 - 2013-11-03 00:00会给出你是TimeSpan 6个小时。但实际上,7个小时将会过去,因为那是DST结束的那一天,时钟在1:00到2:00之间重复。

要避免此问题,您只应使用DateTime中的Utc值进行数学计算,或者应使用DateTimeOffset值。

答案 2 :(得分:0)

如果你有一个班级

public class Time
{
    public DateTime Start;
    public DateTime Stop;

    public Time(DateTime start, DateTime stop)
    {
        this.Start = start;
        this.Stop = stop;
    }
}

您填写日期时间值,您可以获得平均值...

var avg = Times.Select(p => p.Stop - p.Start).Average(p => p.Seconds);

你可以用你想要的任何东西替换p.Seconds ..小时,分钟等...... 注意:未经测试,但我认为它可能有效

编辑:啊,已经回答了:)