Суммировать массив TimeSpan с одной строкой? - PullRequest
2 голосов
/ 13 июля 2010

Есть ли способ объединить несколько агрегатов в один промежуток времени?

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

Я ищу некоторые встроенные возможности, о которых я не знаю.

Обновление Пожалуйста, прочитайте мой комментарий на Ответ Рида Копси .

Ответы [ 5 ]

12 голосов
/ 13 июля 2010

C #:

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

VB.NET:

Dim sum As TimeSpan = times.Aggregate(Function(t1, t2) t1.Add(t2))
2 голосов
/ 13 июля 2010

У вас есть ответ - просто используйте 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
1 голос
/ 13 июля 2010

Вы можете использовать метод Sum для добавления значения 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 t As New TimeSpan(times.Sum(Function(t) t.Ticks))
1 голос
/ 13 июля 2010

Конечно.

Enumerable.Aggregate просто нужно Func<T, T, T> - что-то, что берет два T объекта и объединяет их в некотором роде для создания нового T.Таким образом, вы можете использовать метод Юрия :

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

Или вы также можете сделать что-то вроде , что предложил Тим Кокер , используя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))
0 голосов
/ 13 июля 2010

Вам нужно сложить 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)
...