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's answer に関する私のコメントを読んでください。

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>は---2つのTオブジェクトを取得し、それらを何らかの方法で集約して新しいを生成するものTです。だからあなたはユーリーの方法で行くことができます:

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

または、拡張メソッドを使用して、TimCokerが提案したような ことを行うこともできます。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、それぞれから値を追加でき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 に答える