我有一个
列表*startTime (datetime)
*endTime (datetime)
并且需要计算列表中所有内容的平均时间。
所以我猜我需要像
这样的东西long averageTime =
Convert.ToInt64(listOfStartEndTimes.Average(timeSpan => timeSpan.Ticks))
有什么想法吗?
答案 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);
此外,由于您的Start
和Stop
值属于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 ..小时,分钟等...... 注意:未经测试,但我认为它可能有效
编辑:啊,已经回答了:)