<C#>リストの不要なデータを削除してソートする
LINQって何?(笑)
ログファイルから実績数を調べるときにLINQを使ったら便利でした。
編集したい内容は、
- 合否判定がPASSのもの
- 重複したデータは削除する(残すのは最後のデータ)
- 日時でソート
ということを1行でできちゃった。
ログファイルの内容
- 日時
- シリアル
- 合否判定
ログファイルはこんな感じ
こんなファイルが複数あります。
ファイルからリストに入れるところは省略してプログラムで入れました。
プログラムはこんな感じ
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#を受講しました。
コメントでアドバイスをいただけると幸いです。
↓ほしい物リスト↓