通过扩展方法简化求和 TimeSpan

Sum TimeSpan by extension method simplification

我找到了here这个扩展方法

/// <summary>
/// Calculates the sum of the given timeSpans.
/// </summary>
public static TimeSpan Sum(this IEnumerable<TimeSpan> timeSpans)
{
    TimeSpan sumTillNowTimeSpan = TimeSpan.Zero;

    foreach (TimeSpan timeSpan in timeSpans)
    {
        sumTillNowTimeSpan += timeSpan;
    }
    return sumTillNowTimeSpan;           
}

用法:

List<TimeSpan> timeSpans = new List<TimeSpan>();
timeSpans.Add(TimeSpan.FromHours(1));
timeSpans.Add(TimeSpan.FromHours(2));
timeSpans.Add(TimeSpan.FromHours(3));
TimeSpan sum = timeSpans.Sum();// will be 06:00

问题:

这个扩展是否有用,或者它是否也可以用一行 linq 来解决

TimeSpan sum = timeSpans.Sum(); //Linq.Sum() - this doesn't compile

我希望它能编译,因为 Sum() 内部 += 所有值 - 对他的好奇是 Visual Studio 的智能感知建议我使用 Sum() 和存在重载,但无法编译。

所以下面的不编译...

List<TimeSpan> timeSpans = new List<TimeSpan>();
timeSpans.Add(TimeSpan.FromHours(1));
timeSpans.Add(TimeSpan.FromHours(2));
timeSpans.Add(TimeSpan.FromHours(3));
TimeSpan sum = timeSpans.Sum();// will be 06:00

提供的扩展方法的替代方法是...

TimeSpan sum = TimeSpan.FromMilliseconds(timeSpans.Sum(t => t.TotalMilliseconds));

编辑:正如 TheGeneral 所指出的,如果纳秒是一个问题,最好使用 Ticks long 属性 来避免舍入错误...

TimeSpan sum = TimeSpan.FromTicks(timeSpans.Sum(t => t.Ticks));

虽然我认为我实际上更喜欢 kurakura88 的答案,因为它使用 TimeSpan 的 Add 方法,该方法应该比您可以用来添加 TimeSpans 的任何其他方法更可靠

我喜欢 Mick 的 回答(已投票),虽然 id 使用刻度 所以你不会失去精度

如果你有Printable Character OCD强迫症你可以把它放在你自己的很棒的扩展中

public static class TimeSpanExtensions
{
   public static TimeSpan Sum(this IEnumerable<TimeSpan> source)
      => TimeSpan.FromTicks(source.Sum(t => t.Ticks));
}

用法

List<TimeSpan> timeSpans = new List<TimeSpan>();
timeSpans.Add(TimeSpan.FromHours(1));
timeSpans.Add(TimeSpan.FromHours(2));
timeSpans.Add(TimeSpan.FromHours(3));
TimeSpan sum = timeSpans.Sum();

由于 LinqSum 不适用于 IEnumerable<TimeSpan>,另一种选择是使用 Aggregate

TimeSpan sum = timespans.Aggregate(TimeSpan.Zero, (t1,t2) => t1.Add(t2));