2

有没有办法将多个聚合聚合到 1 个时间跨度?

Dim times = { 
  New TimeSpan(1, 0, 0),
  New TimeSpan(1, 10, 0),
  New TimeSpan(1, 50, 0),
  New TimeSpan(0, 20, 0),
  New TimeSpan(0, 10, 0)
}

Dim sum As New TimeSpan
For Each ts In times
  sum = sum.Add(ts)
Next

'That's what I desire:
sum = times.Sum
sum = times.Aggregate

我正在寻找一些我不知道的内置功能。

更新 请阅读我对Reed Copsey 回答的评论。

4

5 回答 5

12

C#:

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

VB.NET:

Dim sum As TimeSpan = times.Aggregate(Function(t1, t2) t1.Add(t2))
于 2010-07-13T16:43:49.597 回答
2

你有答案 - 只需使用TimeSpan.Add

如果要避免循环,可以使用 LINQ 的Enumerable.Aggregate进行收集:

Dim sum as TimeSpan
sum = times.Aggregate(Function(ByVal current, ByVal ts) ts.Add(current) )

编辑:如果你想要一个扩展方法来做到这一点,你可以这样做:

''
<Extension()> 
Public Function Aggregate(ByVal IEnumerable(Of TimeSpan) times) As TimeSpan
     Return times.Aggregate(Function(ByVal current, ByVal ts) ts.Add(current) )
End Function
于 2010-07-13T16:42:46.027 回答
1

当然。

Enumerable.Aggregate只需要一个Func<T, T, T>- 需要两个T对象并以某种方式聚合它们以产生新的T. 所以你可以使用Yuriy 的方法

// The + operator is defined for TimeSpan, so you're fine just using that.
TimeSpan sum = times.Aggregate((t1, t2) => t1 + t2);

或者 ,您也可以使用扩展方法执行Tim Coker 建议的操作:Enumerable.Sum

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

更新:这里是 VB.NET 等价物:

Dim sum = times.Aggregate(Function(t1, t2) t1 + t2)

Dim sum = TimeSpan.FromTicks(times.Sum(Function(t) t.Ticks))
于 2010-07-13T16:50:09.650 回答
1

您可以使用该Sum方法Ticks从 each 中添加值TimeSpan

Dim times = { _
  New TimeSpan(1, 0, 0), _
  New TimeSpan(1, 10, 0), _
  New TimeSpan(1, 50, 0), _
  New TimeSpan(0, 20, 0), _
  New TimeSpan(0, 10, 0) _
}

Dim t As New TimeSpan(times.Sum(Function(t) t.Ticks))
于 2010-07-13T16:50:34.860 回答
0

您需要求和然后使用该值TimeSpan.Ticks创建一个新的TimeSpan

Dim times = 
{ 
    New TimeSpan(1, 0, 0), 
    New TimeSpan(1, 10, 0), 
    New TimeSpan(1, 50, 0), 
    New TimeSpan(0, 20, 0), 
    New TimeSpan(0, 10, 0) 
}

Dim sumTicks As Long = 0
For Each ts In times
    sumTicks += ts.Ticks
Next

Dim sum As New TimeSpan(sumTicks)
于 2010-07-13T16:43:27.677 回答