2025年7月18日
C#でテキストファイルの重複行を削除して、新しいファイルに保存したい場合、
どのような方法が一番効率的なのでしょうか?
この記事では、C#/.NET 8 における代表的な2つの方法、
Distinct() を使った方法(順序維持に最適)HashSet を使った方法(パフォーマンス重視)を比較しながら、それぞれの使い方と違いを解説します。サンプルコード付きで、初心者にもやさしく紹介します!
List<string> に変換する方法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で重複を削除して保存しました。");
}
}
IEnumerable<string> に対してそのまま使える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で重複を削除して保存しました。");
}
}
new HashSet<string>(StringComparer.OrdinalIgnoreCase) も可能| 特徴 | Distinct() | HashSet |
|---|---|---|
| 順序の保持 | ✅ はい | ✅ はい(実装次第) |
| 処理速度(大量) | ⛔ やや遅い | ✅ 高速 |
| 記述の簡潔さ | ✅ 短い | ⛔ 長め |
| 大文字小文字の制御 | ❌ 拡張必要 | ✅ StringComparer 指定可能 |
| 適した用途 | 小〜中規模の重複除去 | 中〜大規模の高速重複除去 |
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で表示する方法【コード付き解説】
MenuFlyout は WinUI 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
WinUI 3 ComboBoxの自作クラスバインドと選択イベント検出方法
System.Text.Json 9.0.0.0 で FileNotFoundException
C#で改行・カンマ入りのCSVを正しく読み込む方法【.NET8対応】
C#/.NET 8でDateTimeを日本時間でISO 8601形式に変換する方法