C#, LINQのSumで複数のTimeSpanの合計を得る
はじめに
↓こんな感じでできると思っていた。
// LINQを使う using System.Linq; // 集計対象 var timespans = new[] { new TimeSpan(0, 0, 1), new TimeSpan(0, 1, 0), new TimeSpan(1, 0, 0), }; var total_time = timespans.Sum();
「TimeSpan[]には引数無しのSumの定義は無いですよ」(意訳)とVisual Studioさんが告げる。
こうします
var total_ticks = timespans.Sum(t => t.Ticks); var total_time = new TimeSpan(total_ticks); // 01:01:01
おまけ?分単位や秒単位だといくつになるか?
var total_minutes = total_time.TotalMinutes; // 61.016666666666666 var total_seconds = total_time.TotalSeconds; // 3661
他にもTotalHours
やTotalDays
、TotalMilliseconds
がある。便利だ。
おまけ?TimeSpanのインスタンス作成時の引数ticksに最大値を入れると・・・?
var max_timespan = new TimeSpan(long.MaxValue);
10675199.02:48:05.4775807
になった。
ちなみにlong.MaxValue
は9223372036854775807
。
10675199
は約29247
年、遠大だ。
オーバーフローするとマイナスに転じるので注意しよう(発生しそうにない)。
雑記
小さく分けて書いてみた。こっちの方が良さげ。
補足
IDE
- Microsoft Visual Studio Community 2019
- Version 16.5.3
- Microsoft .NET Framework
- Version 4.8.03752
プロジェクト
- コンソール アプリ(C#)
- .NET Core 3.1