我有平均時間爲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