我有一个包含 TimeSpan 变量的对象集合:
MyObject
{
TimeSpan TheDuration { get; set; }
}
我想使用 LINQ 来计算这些时间的总和。
当然,(从 MyCollection 中的 r 选择 r.TheDuration).Sum();不起作用!
我正在考虑将 TheDuration 的数据类型更改为 int,然后对其求和并将总和转换为 TimeSpan。这会很混乱,因为我集合中的每个 TheDuration 都在其他地方用作时间跨度。
对这个总结有什么建议吗?
不幸的是,没有超载Sum
接受一个IEnumerable<TimeSpan>
。此外,当前没有方法为类型参数指定基于运算符的泛型约束,因此即使TimeSpan
是“本机”可求和的,这一事实不能通过通用代码轻松获取。
正如您所说,一种选择是总结相当于时间跨度的积分类型,然后将that总和为TimeSpan
再次。对此的理想属性是TimeSpan.Ticks http://msdn.microsoft.com/en-us/library/system.timespan.ticks.aspx,准确地往返。但根本没有必要改变类的属性类型;你可以project:
var totalSpan = new TimeSpan(myCollection.Sum(r => r.TheDuration.Ticks));
或者,如果您想坚持 TimeSpan 的+
运算符进行求和,您可以使用Aggregate
操作员:
var totalSpan = myCollection.Aggregate
(TimeSpan.Zero,
(sumSoFar, nextMyObject) => sumSoFar + nextMyObject.TheDuration);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)