早く流れる川で

雑に書き留めた何か

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

他にもTotalHoursTotalDaysTotalMillisecondsがある。便利だ。

おまけ?TimeSpanのインスタンス作成時の引数ticksに最大値を入れると・・・?

var max_timespan = new TimeSpan(long.MaxValue);

10675199.02:48:05.4775807になった。
ちなみにlong.MaxValue9223372036854775807
10675199は約29247年、遠大だ。
オーバーフローするとマイナスに転じるので注意しよう(発生しそうにない)。

雑記

小さく分けて書いてみた。こっちの方が良さげ。

補足

IDE

プロジェクト

  • コンソール アプリ(C#)
    • .NET Core 3.1