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