2012-01-13 35 views
40

Tôi có bộ sưu tập TimeSpans, chúng đại diện cho thời gian dành cho công việc. Bây giờ tôi muốn tìm thời gian trung bình dành cho nhiệm vụ đó. Nó sẽ được dễ dàng nhưng đối với một số lý do tôi không nhận được trung bình chính xác.Tìm trung bình bộ sưu tập của TimeSpans

Dưới đây là mã của tôi:

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

Vui lòng cung cấp dữ liệu mẫu và bạn nhận được kết quả gì và bạn mong đợi điều gì. BTW: Việc đặt hàng là không cần thiết. –

Trả lời

75

Bạn có thể sử dụng Average overload mà có một bộ sưu tập dài trong tham số.

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

return new TimeSpan(longAverageTicks); 
+0

@GeorgeDuckett Tôi đã nhận thấy nó và thay đổi để đánh dấu, nhờ –

+1

+1 bởi vì tôi đã không nghĩ rằng để sử dụng quá tải của 'Trung bình'. –

+0

và +1 cho câu trả lời của bạn hoạt động quá :) –

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

Lưu ý, phương pháp của bạn trả về một Nullable, nhưng không cần, trừ khi bạn muốn trả về null nếu danh sách nguồn là trống rỗng, trong trường hợp này chỉ cần làm một kiểm tra riêng biệt đầu tiên .

3

Ngoài các câu trả lời ở trên, tôi sẽ đề nghị bạn mất trung bình trên Giây hoặc mili giây mức (tùy thuộc vào những gì bạn yêu cầu)

sourceList.Average(timeSpan => timeSpan.ToTalMilliseconds) 

Bây giờ sử dụng giá trị này, bạn có thể đến các đối tượng TimeSpan mới sử dụng

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

Tôi chỉ muốn cảnh báo tất cả mọi người rằng nếu trung bình của bạn thậm chí không bằng một phần nghìn giây, hơn vì [một số vấn đề về độ chính xác] (http://stackoverflow.com/a/5450832/1108200) trung bình mới của bạn 'TimeSpan' sẽ luôn là 0 – Artholl

+0

@Artholl Đó là vấn đề chính xác của tôi – Coops

Các vấn đề liên quan