背景
List<Class>型のコレクションの要素にDateTime型があり、
”最新の計測タイムより〇秒前の時刻を持つ要素を全て削除する”
がしたかったのでそのメモ。
WPFで書いてるから余計な部分も少しあるけどご愛敬。
準備
ExampleList.cs
classExampleList{publicintNumber{get;set;}publicDateTimeTimeStamp{get;set;}}リストに使うクラスを作成
MainWindow.cs
privateList<ExampleList>_list=newList<ExampleList>();privateDateTimeDt;//最新の時刻が入るpublicMainWindow(){InitializeComponent();ListAdd();Console.WriteLine("削除前");ListCheck();Console.WriteLine("Dt(最新の時刻):"+Dt);}privatevoidListAdd(){DateTimedt=DateTime.Now;for(inti=1;i<=10;i++){DateTimedt2=dt.AddSeconds(i);//dt + i 秒_list.Add(newExampleList(){Number=i,TimeStamp=dt2});Dt=dt2;}}privatevoidListCheck(){foreach(ExampleListelin_list)Console.WriteLine("ナンバー:{0} 時刻{1}",el.Number,el.TimeStamp);}ListAddメソッドでlistに項目を追加します。ListCheckメソッドでlistの中身を確認します。
実行すると
削除前
ナンバー:1 時刻2020/09/15 0:25:16
ナンバー:2 時刻2020/09/15 0:25:17
ナンバー:3 時刻2020/09/15 0:25:18
ナンバー:4 時刻2020/09/15 0:25:19
ナンバー:5 時刻2020/09/15 0:25:20
ナンバー:6 時刻2020/09/15 0:25:21
ナンバー:7 時刻2020/09/15 0:25:22
ナンバー:8 時刻2020/09/15 0:25:23
ナンバー:9 時刻2020/09/15 0:25:24
ナンバー:10 時刻2020/09/15 0:25:25
Dt(最新の時刻):2020/09/15 0:25:25
こんな感じで10個のリスト項目ができました。
指定した秒数より前の要素を削除する
本題です。
指定した秒数より前の時刻を持つリスト要素を削除するメソッド Removeを追加します。
MainWindow.cs
privatevoidRemove(){ints=-5;//秒数の指定DateTimeago=Dt.AddSeconds(s);//最新の計測からs秒前の時刻intresult=_list.FindLastIndex(t=>t.TimeStamp<=ago);//{リストの中で指定秒数前の値を持つインデックス}のうち最も大きいインデックス場号を検索_list.RemoveRange(0,result);//リストのインデックス 0~result を削除}
MainWindowメソッドから実行します
MainWindow.cs
publicMainWindow(){InitializeComponent();ListAdd();Console.WriteLine("削除前");ListCheck();Console.WriteLine("Dt(最新の時刻):"+Dt);Remove();Console.WriteLine("削除後");ListCheck();}
実行結果
削除前
ナンバー:1 時刻2020/09/15 0:25:16
ナンバー:2 時刻2020/09/15 0:25:17
ナンバー:3 時刻2020/09/15 0:25:18
ナンバー:4 時刻2020/09/15 0:25:19
ナンバー:5 時刻2020/09/15 0:25:20
ナンバー:6 時刻2020/09/15 0:25:21
ナンバー:7 時刻2020/09/15 0:25:22
ナンバー:8 時刻2020/09/15 0:25:23
ナンバー:9 時刻2020/09/15 0:25:24
ナンバー:10 時刻2020/09/15 0:25:25
Dt(最新の時刻):2020/09/15 0:25:25
削除後
ナンバー:5 時刻2020/09/15 0:25:20
ナンバー:6 時刻2020/09/15 0:25:21
ナンバー:7 時刻2020/09/15 0:25:22
ナンバー:8 時刻2020/09/15 0:25:23
ナンバー:9 時刻2020/09/15 0:25:24
ナンバー:10 時刻2020/09/15 0:25:25
指定した秒数より前の時刻を持つリスト要素を削除することができました。
最終的なコード全体
class ExampleListは最初から変わっていないので省きます。
MainWindow.cs
publicpartialclassMainWindow:Window{privateList<ExampleList>_list=newList<ExampleList>();privateDateTimeDt;//最新の時刻が入るpublicMainWindow(){InitializeComponent();ListAdd();Console.WriteLine("削除前");ListCheck();Console.WriteLine("Dt(最新の時刻):"+Dt);Remove();Console.WriteLine("削除後");ListCheck();}privatevoidListAdd(){DateTimedt=DateTime.Now;for(inti=1;i<=10;i++){DateTimedt2=dt.AddSeconds(i);//dt + i 秒_list.Add(newExampleList(){Number=i,TimeStamp=dt2});Dt=dt2;}}privatevoidRemove(){ints=-5;//秒数の指定DateTimeago=Dt.AddSeconds(s);//最新の計測からs秒前の時刻intresult=_list.FindLastIndex(t=>t.TimeStamp<=ago);//{リストの中で指定秒数前の値を持つインデックス}のうち最も大きいインデックス場号を検索_list.RemoveRange(0,result);//リストのインデックス 0~result を削除}privatevoidListCheck(){foreach(ExampleListelin_list)Console.WriteLine("ナンバー:{0} 時刻{1}",el.Number,el.TimeStamp);}}