通过扩展方法简化求和 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();
由于 Linq
的 Sum
不适用于 IEnumerable<TimeSpan>
,另一种选择是使用 Aggregate
。
TimeSpan sum = timespans.Aggregate(TimeSpan.Zero, (t1,t2) => t1.Add(t2));
我找到了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();
由于 Linq
的 Sum
不适用于 IEnumerable<TimeSpan>
,另一种选择是使用 Aggregate
。
TimeSpan sum = timespans.Aggregate(TimeSpan.Zero, (t1,t2) => t1.Add(t2));