2010-07-13 2 views
2

Есть ли способ объединить несколько агрегатов в один временной интервал?Sum 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 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's answer.

ответ

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)) 
+0

@Shimmy: Спасибо, был в процессе поиска. –

+0

Да, np ...lolz, я принял, так как это точный один лайнер, который я искал без bs. – Shimmy

2

У вас есть ответ, просто используйте TimeSpan.Add.

Вы можете сделать коллекцию с помощью LINQ-х Enumerable.Aggregate, если вы хотите, чтобы избежать петли:

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

Edit: Если вы хотите метод расширения, чтобы сделать это, вы могли бы сделать:

'' 
<Extension()> 
Public Function Aggregate(ByVal IEnumerable(Of TimeSpan) times) As TimeSpan 
    Return times.Aggregate(Function(ByVal current, ByVal ts) ts.Add(current)) 
End Function 
+0

Я думаю, что мой вопрос больше о разгибании методах, время пролет просто жертва. Я хочу узнать, есть ли способ сделать что-то подобное с помощью методов расширения. – Shimmy

+0

@Shimmy: Да, я только что отредактировал, чтобы показать вам, как это сделать с LINQ. Однако, ваш вопрос ОЧЕНЬ плохо сформулирован. Добавить делает агрегирует значения ... –

+0

Вы правы. но я сказал в своих примерах, что хочу, во всяком случае, вы заслуживаете того, что я совершил в самом деле. – Shimmy

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) 
+0

продолжение линии удалено – Shimmy

1

Конечно.

Enumerable.Aggregate просто нужно Func<T, T, T> - то, что занимает две T объектов и агрегирует их в некотором роде продукт нового T. Таким образом, вы можете пойти с Yuriy's method:

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

Или, вы также можете сделать что-то какwhat Tim Coker suggested, используя метод Enumerable.Sum расширения:

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

Update: Вот эквиваленты VB.NET :

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

Dim sum = TimeSpan.FromTicks(times.Sum(Function(t) t.Ticks)) 
1

Вы можете использовать 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)) 
+0

продолжение линии удалено. – Shimmy

+0

@Shimmy: продолжение линии откладывается, так как оно не скомпилируется без него. – Guffa

+0

В VB10 это делает ... – Shimmy