ナルシーNote

2020年12月からC#、2021年2月からPythonを51歳で始めました。学んだことを備忘録として残してます。そろそろN88BASICは卒業しようかな😱

<C#>リストの不要なデータを削除してソートする

 LINQって何?(笑)

 ログファイルから実績数を調べるときにLINQを使ったら便利でした。

 編集したい内容は、

  • 合否判定がPASSのもの
  • 重複したデータは削除する(残すのは最後のデータ)
  • 日時でソート

 ということを1行でできちゃった。

ログファイルの内容

  • 日時
  • シリアル
  • 合否判定

ログファイルはこんな感じ

f:id:Cars_Narcy:20210526124843p:plain

logファイル

こんなファイルが複数あります。  

ファイルからリストに入れるところは省略してプログラムで入れました。

 

プログラムはこんな感じ

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {

            // サンプルデータを作成する
            var allLists = new List<List>();
            {
                allLists.Add(new List { "2021/06/01 09:00:00", "21610001", "PASS" });
                allLists.Add(new List { "2021/06/01 09:03:00", "21610003", "FAIL" });
                allLists.Add(new List { "2021/06/01 09:05:00", "21610003", "FAIL" });
                allLists.Add(new List { "2021/06/01 09:10:00", "21610003", "PASS" });
                allLists.Add(new List { "2021/06/01 09:11:00", "21610003", "PASS" });
                allLists.Add(new List { "2021/06/01 09:02:00", "21610002", "PASS" });
                allLists.Add(new List { "2021/06/01 09:04:00", "21610004", "PASS" });
                allLists.Add(new List { "2021/06/01 09:06:00", "21610005", "PASS" });
                allLists.Add(new List { "2021/06/01 09:07:00", "21610006", "PASS" });
                allLists.Add(new List { "2021/06/01 09:09:00", "21610007", "PASS" });

            };

            // 正常品と、シリアルのダブりを除いて日時でソートする
            IEnumerable targets = allLists
                                        .Where(x => x[2] == "PASS")
                                        .GroupBy(x => x[1])
                                        .Select(x => x.Last())
                                        .OrderBy(x => x[0]);

            // 結果を表示する
            foreach (IEnumerable target in targets)
            {
                foreach (var item in target)
                {
                    Console.Write(item + ",");
                }
                Console.WriteLine();
            }
        }
    }
}

 

 実行結果

2021/06/01 09:00:00,21610001,PASS,
2021/06/01 09:02:00,21610002,PASS,
2021/06/01 09:04:00,21610004,PASS,
2021/06/01 09:06:00,21610005,PASS,
2021/06/01 09:07:00,21610006,PASS,
2021/06/01 09:09:00,21610007,PASS,
2021/06/01 09:11:00,21610003,PASS,
    

 すごいですね。

見やすいように改行してますけど、実質1行でできちゃいました。

IEnumerable targets = allLists
                .Where(x => x[2] == "PASS")
                .GroupBy(x => x[1])
                .Select(x => x.Last())
                .OrderBy(x => x[0]);

 

ご使用に関しては自己責任でよろしくお願い申し上げます。

2020年12月にpaizaラーニングでC#を受講しました。

コメントでアドバイスをいただけると幸いです。

 

ほしい物リスト

ナルシーのほしい物リストはこちら