我有平均时间为sql
*startTime (datetime)
*endTime (datetime)
列表和需要解决的平均时间在列表中的一切。
所以我猜我需要这样的东西
long averageTime =
Convert.ToInt64(listOfStartEndTimes.Average(timeSpan => timeSpan.Ticks))
任何想法?
我有平均时间为sql
*startTime (datetime)
*endTime (datetime)
列表和需要解决的平均时间在列表中的一切。
所以我猜我需要这样的东西
long averageTime =
Convert.ToInt64(listOfStartEndTimes.Average(timeSpan => timeSpan.Ticks))
任何想法?
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);
如果你有一个类
public class Time
{
public DateTime Start;
public DateTime Stop;
public Time(DateTime start, DateTime stop)
{
this.Start = start;
this.Stop = stop;
}
}
那你跟你也许可以datetime值填写得到平均值...
var avg = Times.Select(p => p.Stop - p.Start).Average(p => p.Seconds);
在这里你可以替换p.Seconds,不管你想..小时,分钟等.. 注:没有测试,但我认为它可能工作
编辑:啊,已经回答了:)
感谢您的贡献 – DreamToCode
我认为你的意思是'.TotalSeconds',而不是'.Seconds'。 –
其他答案是正确的,你可以用简单的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
会给你6的TimeSpan
小时。但实际上,7个小时将会过去,因为这是DST结束的时间,并且时钟在1:00到2:00之间重复一小时。
要避免此问题,您应该只使用Utc
中的DateTime
值进行数学运算,或者应该使用DateTimeOffset
值代替。
是一个很好的答复谢谢你。本质上,我只需要几秒钟内的平均值,这将是一个内部应用程序,因此.kind将保持不变。 – DreamToCode
仅仅因为它的内部应用程序并不能减轻对此类应用程序的需求。我的建议是使用DateTimeOffset。 –
完美!然后简单地转换为小时分钟秒 – DreamToCode
@DreamToCode其实我删除了那条评论,因为我认为我误解了你计算的平均值。你是计算每对开始/结束时间的平均值(所以你只添加两个TickCounts在一起,这将不会溢出),或者你想要所有时间的平均值(在这种情况下,你将*很可能得到一个溢出问题)? –
这将是开始/结束时间的整个列表的平均值。 – DreamToCode