Найти среднее значение коллекции TimeSpans - PullRequest
46 голосов
/ 13 января 2012

У меня есть коллекция 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());
}

Ответы [ 3 ]

88 голосов
/ 13 января 2012

Вы можете использовать Средняя перегрузка , которая принимает коллекцию long в параметре.

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

return new TimeSpan(longAverageTicks);
12 голосов
/ 13 января 2012
var average = new TimeSpan(sourceList.Select(ts => ts.Ticks).Average());

Обратите внимание, ваш метод возвращает Nullable , но не требуется, если только вы не хотите вернуть null, если список источников пуст, и в этом случае сначала выполните отдельную проверку.

3 голосов
/ 13 января 2012

В дополнение к вышеприведенному ответу я бы посоветовал вам взять среднее значение на уровне секунд или миллисекунд (в зависимости от того, что вам требуется)

sourceList.Average(timeSpan => timeSpan.ToTalMilliseconds)

Теперь, используя это значение, вы можете получить новый интервал времени, используя

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