2012-01-13 2 views
40

J'ai une collection de TimeSpans, ils représentent le temps passé à faire une tâche. Maintenant, je voudrais trouver le temps moyen consacré à cette tâche. Cela devrait être facile, mais pour une raison quelconque, je ne reçois pas la bonne moyenne.Trouver la moyenne de collection de TimeSpans

Voici mon code:

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()); 
} 
+0

Veuillez fournir des exemples de données et quel résultat vous obtenez et quel résultat vous attendez. BTW: La commande n'est pas nécessaire. –

Répondre

75

Vous pouvez utiliser le Average overload qui prend une collection de longue paramètre.

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

return new TimeSpan(longAverageTicks); 
+0

@GeorgeDuckett Je l'ai remarqué et changé en ticks, merci –

+1

+1 parce que je n'ai pas pensé à utiliser la surcharge de 'Average'. –

+0

et +1 pour votre réponse qui fonctionne aussi :) –

11
var average = new TimeSpan(sourceList.Select(ts => ts.Ticks).Average()); 

Remarque, votre méthode retourne un Nullable, mais n'a pas besoin, sauf si vous voulez retourner null si la liste des sources est vide, dans ce cas, il suffit de faire un chèque séparé premier .

3

En plus de la réponse ci-dessus, je vous conseille de prendre une moyenne sur la secondes Millisecondes niveau (en fonction de ce que vous avez besoin)

sourceList.Average(timeSpan => timeSpan.ToTalMilliseconds) 

Maintenant, en utilisant cette valeur, vous pouvez arriver à la nouvelle TimeSpan en utilisant

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

Je veux juste avertir tout le monde que si votre moyenne n'est même pas une milliseconde, à cause de [quelques problèmes de précision] (http://stackoverflow.com/a/5450832/1108200) votre nouvelle moyenne 'TimeSpan' sera toujours 0 – Artholl

+0

@Artholl C'était mon problème exact – Coops

Questions connexes