質問: プログラミング初心者の者です。 自分では実装ができない処理があったため質問させていただきました。 現在C#で、エクセルファイルを読み込ませ、内容をデータベースに登録させるプログラムを書いています。エクセルファイルの中身は、1行ごとに[名前,性別,生年月日]を入力する表になっています。 ファイルを読み込ませるときに、各列の入力値の検証を行っており、もし不正な値が入力されていた場合は、 [【i】行目:【項目名】の値が不正です] のような行番号を明示したエラーメッセージを配列に格納するようにしています。 最終的にその配列の中身はログとして出力するのですが、以下のように表示される場合があり、改善したいと考えています。 3行目:名前の値が不正です 3行目:性別の値が不正です 3行目:生年月日が不正です 4行目:性別の値が不正です . . . 上記の場合、以下のように重複する先頭4文字を削除して表示させたいと考えいます。 3行目:名前の値が不正です 性別の値が不正です 生年月日が不正です 4行目:性別の値が不正です . . . 私が解決できず困っている点は、 1先頭4文字を対象とした重複チェック処理 2重複する値の削除 3その処理を行うタイミングは、エラーメッセージ格納時か?それともログ出力時か? 以上の3点です。 この3つの問題を解決する方法を、 または何かしらのヒントでも構いません。教えていただけないでしょうか? よろしくお願いいたします。
回答: ログを出力するプログラムを変更することが可能であれば、重複をあとから削除するのではなく出力時にそれを考慮して出力する方が簡単で確実です。たとえば次のようなクラスを出力する例では LINQ を使って書くことが出来ます。 実行してみた結果も合わせてどうぞ: ``` using System; using System.Linq; using System.Collections.Generic; class ErrorLog { public int Line { get; set; } public string Message { get; set; } public ErrorLog(int line, string message) { this.Line = line; this.Message = message; } } class Logger { public static void Write(IEnumerable logs) { string output = string.Join("\n", logs.GroupBy(x => x.Line) .Select(x => x.Key + "行目:" + string.Join("\n", x.Select(y => y.Message)))); Console.WriteLine(output); } } public class Test { public static void Main() { var logs = new[] { new ErrorLog(3, "名前の値が不正です"), new ErrorLog(3, "性別の値が不正です"), new ErrorLog(3, "生年月日が不正です"), new ErrorLog(4, "性別の値が不正です"), }; Logger.Write(logs); } } ```