ファイル重複レコード

【C# .NET 8】ファイルから重複行を削除する2つの方法|Distinct vs HashSet|サンプルコード付き

2025年7月18日

✅ はじめに

C#でテキストファイルの重複行を削除して、新しいファイルに保存したい場合、
どのような方法が一番効率的なのでしょうか?

この記事では、C#/.NET 8 における代表的な2つの方法、

を比較しながら、それぞれの使い方と違いを解説します。サンプルコード付きで、初心者にもやさしく紹介します!

🎯 この記事で得られること

📦 開発環境

📄 入力ファイル例(input.txt)

apple
banana
apple
orange
banana

✅ 方法①:Distinct() で重複を削除(順序保持)

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

class Program
{
    static async Task Main()
    {
        string inputPath = "input.txt";
        string outputPath = "output_distinct.txt";

        var lines = await File.ReadAllLinesAsync(inputPath);
        var uniqueLines = lines.Distinct().ToList();

        await File.WriteAllLinesAsync(outputPath, uniqueLines);

        Console.WriteLine("Distinctで重複を削除して保存しました。");
    }
}

✅ 特徴

🚀 方法②:HashSet を使って重複を削除(高速・大規模向け)

using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        string inputPath = "input.txt";
        string outputPath = "output_hashset.txt";

        var lines = await File.ReadAllLinesAsync(inputPath);
        var seen = new HashSet<string>();
        var result = new List<string>();

        foreach (var line in lines)
        {
            if (seen.Add(line))  // 追加成功 = 初めての値
                result.Add(line);
        }

        await File.WriteAllLinesAsync(outputPath, result);

        Console.WriteLine("HashSetで重複を削除して保存しました。");
    }
}

✅ 特徴

📊 Distinct vs HashSet 比較表

特徴 Distinct() HashSet
順序の保持 ✅ はい ✅ はい(実装次第)
処理速度(大量) ⛔ やや遅い ✅ 高速
記述の簡潔さ ✅ 短い ⛔ 長め
大文字小文字の制御 ❌ 拡張必要 StringComparer 指定可能
適した用途 小〜中規模の重複除去 中〜大規模の高速重複除去

🧠 応用Tips:大文字小文字を無視して重複を削除する

var seen = new HashSet<string>(StringComparer.OrdinalIgnoreCase);

または、

var uniqueLines = lines
    .Distinct(StringComparer.OrdinalIgnoreCase)
    .ToList();

🔚 まとめ

| シンプルに書きたいなら → Distinct() |
|-----------------------------|
| パフォーマンスを重視するなら → HashSet |

.NET 8 を使えば、非同期I/Oとも組み合わせて、大規模なファイル処理でもスムーズに動作します。
ぜひ、ご自身のアプリケーションに合った方法をお試しください

WinUI 3 / XAML の Grid.Width 設定方法

WinUI 3でMenuFlyoutをShowAtで表示する方法【コード付き解説】

MenuFlyoutWinUI 3 で便利なポップアップメニュー

WinUI 3の開発で混乱しがちな「空白のウィンドウ」と「空白のページ」の違い

PowerShellでMSIXアプリ(Storeアプリ)を起動する方法|AppUserModelIdとURIスキーム活用術

Microsoft Storeアプリ更新時のロールアウト設定まとめ

PowerShellでtail -f!WindowsでUTF-8対応のリアルタイムログ監視を実現する方法

Microsoft純正の新しいコンソールエディタ「edit」が復活!| edit.exe インストール方法

Microsoft Authenticatorのオートフィル機能が2025年7月に終了

RuntimeBroker.exeとMsEdgeWebView2.exeとは?Windows 11のプロセスについて

PowerShellでGrapheme Clusterについて処理を考える

業務用ノートパソコンのストレージは暗号化されている?BitLockerの確認と対策方法

【Windows】Volta コマンドライン インストール | Node.jsをバージョン管理する方法

【C# .NET 8 対応】List<string> を重複なしでマージする方法|

【C#】大容量ファイルを指定サイズ以下に分割する方法|.NET8対応コード付き

【C# .NET 8】ファイルから重複行を削除する2つの方法|Distinct vs HashSet

【C#】.emlファイルの本文を読みやすく抽出する方法

WinUI 3 ComboBoxの自作クラスバインドと選択イベント検出方法

switch文でオブジェクトの型を判別する方法

【WPF】Task.Run中にUIを更新する方法

System.Text.Json 9.0.0.0 で FileNotFoundException

C#で改行・カンマ入りのCSVを正しく読み込む方法【.NET8対応】

C#/.NET 8でDateTimeを日本時間でISO 8601形式に変換する方法

【Anker Soundcore Liberty 4】イヤーピース紛失!代替品はAmazonで購入

和暦設定でも安心!C#でISO 8601やカスタム日時文字列を確実にDateTimeに変換