通过扩展方法简化求和TimeSpan

时间:2018-06-21 06:04:24

标签: c# linq extension-methods

我发现了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(),并且存在现有的重载但它不能编译。

3 个答案:

答案 0 :(得分:4)

由于Linq的{​​{1}}无法用于Sum,因此另一种替代方法是使用IEnumerable<TimeSpan>

Aggregate

答案 1 :(得分:3)

因此以下内容无法编译...

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的任何其他方法都更可靠

答案 2 :(得分:3)

我喜欢 Mick的答案(已投票),尽管id会使用刻度线,这样您就不会失去精度

如果您有可打印字符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();