DateTime要素を持つC#のリストで、最新の計測タイムより〇秒前の時刻を持つ要素を全て削除する

# 背景
```List<Class>``` 型のコレクションの要素にDateTime型があり、
”最新の計測タイムより〇秒前の時刻を持つ要素を全て削除する”
がしたかったのでそのメモ。
WPFで書いてるから余計な部分も少しあるけどご愛敬。

# 準備

```c#:ExampleList.cs
class ExampleList
{
    public int Number { get; set; }
    public DateTime TimeStamp { get; set; }
}
```

リストに使うクラスを作成
<br>


```c#:MainWindow.cs
private List<ExampleList> _list = new List<ExampleList>();
private DateTime Dt; //最新の時刻が入る

public MainWindow()
{
    InitializeComponent();

    ListAdd();
    Console.WriteLine("削除前");
    ListCheck();
    Console.WriteLine("Dt(最新の時刻):" + Dt);
}

private void ListAdd()
{
    DateTime dt = DateTime.Now;
    for (int i = 1; i <= 10; i++)
    {
        DateTime dt2 = dt.AddSeconds(i); //dt + i 秒
        _list.Add(new ExampleList() { Number = i, TimeStamp = dt2 });
        Dt = dt2;
    }
}

private void ListCheck()
{
    foreach (ExampleList el in _list)
        Console.WriteLine("ナンバー：{0}　時刻{1}", el.Number, el.TimeStamp);
}
```

```ListAdd``` メソッドで_listに項目を追加します。
```ListCheck``` メソッドで_listの中身を確認します。
<br>
実行すると

```
削除前
ナンバー：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``` を追加します。

```c#:MainWindow.cs
private void Remove()
{
    int s = -5;                                                 //秒数の指定
    DateTime ago = Dt.AddSeconds(s);                            //最新の計測からs秒前の時刻
    int result = _list.FindLastIndex(t => t.TimeStamp <= ago);  //{リストの中で指定秒数前の値を持つ項目}のうち最も大きいインデックス番号を検索
    _list.RemoveRange(0, result);                               //リストのインデックス 0～result を削除
}
```

<br>
MainWindowメソッドから実行します

```C#:MainWindow.cs
public MainWindow()
{
    InitializeComponent();

    ListAdd();
    Console.WriteLine("削除前");
    ListCheck();
    Console.WriteLine("Dt(最新の時刻):" + Dt);
    Remove();
    Console.WriteLine("削除後");
    ListCheck();
}
```

<br>
実行結果

```
削除前
ナンバー：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``` は最初から変わっていないので省きます。

```c#:MainWindow.cs
public partial class MainWindow : Window
{
    private List<ExampleList> _list = new List<ExampleList>();
    private DateTime Dt; //最新の時刻が入る

    public MainWindow()
    {
        InitializeComponent();
        ListAdd();
        Console.WriteLine("削除前");
        ListCheck();
        Console.WriteLine("Dt(最新の時刻):" + Dt);
        Remove();
        Console.WriteLine("削除後");
        ListCheck();
    }

    private void ListAdd()
    {
        DateTime dt = DateTime.Now;
        for (int i = 1; i <= 10; i++)
        {
            DateTime dt2 = dt.AddSeconds(i); //dt + i 秒
            _list.Add(new ExampleList() { Number = i, TimeStamp = dt2 });
            Dt = dt2;
        }
    }

    private void Remove()
    {
        int s = -5;                                                 //秒数の指定
        DateTime ago = Dt.AddSeconds(s);                            //最新の計測からs秒前の時刻
        int result = _list.FindLastIndex(t => t.TimeStamp <= ago);  //{リストの中で指定秒数前の値を持つ項目}のうち最も大きいインデックス番号を検索
        _list.RemoveRange(0, result);                               //リストのインデックス 0～result を削除
    }

    private void ListCheck()
    {
        foreach (ExampleList el in _list)
            Console.WriteLine("ナンバー：{0}　時刻{1}", el.Number, el.TimeStamp);
    }
}
```