web-dev-qa-db-ja.com

TimeSpansのコレクションの平均を見つける

TimeSpansのコレクションがあり、タスクの実行に費やした時間を表します。次に、そのタスクに費やされた平均時間を見つけたいと思います。簡単なはずですが、何らかの理由で正しい平均値が得られません。

ここに私のコードがあります:

private TimeSpan? GetTimeSpanAverage(List<TimeSpan> sourceList)
{
    TimeSpan total = default(TimeSpan);

    var sortedDates = sourceList.OrderBy(x => x);

    foreach (var dateTime in sortedDates)
    {
        total += dateTime;
    }
    return TimeSpan.FromMilliseconds(total.TotalMilliseconds/sortedDates.Count());
}
48
hs2d

Average extension method を使用できます。

double doubleAverageTicks = sourceList.Average(timeSpan => timeSpan.Ticks);
long longAverageTicks = Convert.ToInt64(doubleAverageTicks);

return new TimeSpan(longAverageTicks);
90
vc 74
var average = new TimeSpan(sourceList.Select(ts => ts.Ticks).Average());

注:メソッドは Nullable を返しますが、ソースリストが空の場合にnullを返す場合を除き、その必要はありません。その場合は、最初に個別のチェックを行うだけです。

11
George Duckett

上記の答えに加えて、秒またはミリ秒のレベルで平均を取ることをお勧めします(必要に応じて)

sourceList.Average(timeSpan => timeSpan.ToTalMilliseconds)

この値を使用すると、次を使用して新しいTimeSpanに到達できます。

TimeSpan avg = TimeSpan.FromMilliseconds(double value here)
3
V4Vendetta