C#のLINQでDistinctを使って重複データを削除する方法!初心者でもわかるデータクエリの基本
生徒
「リストの中に同じ名前や数字がいくつも入ってしまったとき、一つだけにまとめる便利な方法はありますか?」
先生
「それならC#のLINQという機能にある『Distinct(ディスティンクト)』がぴったりですよ。重複したデータを取り除いて、スッキリさせることができます。」
生徒
「ディスティンクト……難しそうな名前ですね。パソコンをあまり触ったことがない私でも使えますか?」
先生
「大丈夫です!魔法の言葉を一つ付け加えるだけですから。具体的な使い方をゆっくり学んでいきましょう!」
1. Distinct(ディスティンクト)とは?
プログラミングをしていると、たくさんのデータが集まった「リスト」を扱うことがよくあります。 例えば、アンケートの結果や、買い物リストなどです。 その中に、偶然同じデータが複数含まれてしまうことがありますよね。 この「同じものが複数ある状態」を重複(ちょうふく)と言います。
Distinctは、英語で「他とはっきり異なる」という意味があります。 C#の世界では、「重複しているデータの中から、同じものは1つだけ残して、あとは全部取り除く」という命令のことを指します。 これを使うと、どんなにバラバラで重複が多いデータでも、ユニークな(唯一無二の)データだけの集まりに整理整頓できるのです。
この機能は、LINQ(リンク)という便利な道具箱の中に入っています。 LINQとは「Language Integrated Query」の略で、データの中から欲しいものだけを探したり、並べ替えたりするための専用の命令セットのことです。
2. なぜ重複を削除する必要があるの?
「別に重なっていてもいいじゃない?」と思うかもしれません。 しかし、実際のプログラム開発では、重複を消さないと困る場面がたくさんあります。
- 名簿の整理: 同じ人が二回登録されていると、メールを二通送ってしまうかもしれません。
- 売れ筋商品の確認: どのお客さんが何を買ったかという履歴から、「売れた商品の種類」だけを知りたいとき。
- 計算の正確性: 重複した数字をそのまま合計してしまうと、正しい結果が出ません。
このように、データを正しく分析したり、無駄な処理を減らしたりするために、Distinctは欠かせない技術なのです。
3. 実際にDistinctを使ってみよう!
それでは、簡単な数字のリストを使って、実際に重複を消してみましょう。 プログラミング未経験の方でも安心してください。 まずは「1, 2, 2, 3, 4, 4, 5」という、2と4が重なっているリストを想像してみましょう。
サンプルコード:数字の重複を消す
using System;
using System.Collections.Generic;
using System.Linq; // LINQを使うためにこれが必要です!
class Program
{
static void Main()
{
// 重複のある数字のリストを作ります
List<int> numbers = new List<int> { 1, 2, 2, 3, 4, 4, 5 };
// Distinctを使って重複を削除します
var uniqueNumbers = numbers.Distinct();
// 結果を表示します
Console.WriteLine("重複を消した結果:");
foreach (var n in uniqueNumbers)
{
Console.WriteLine(n);
}
}
}
実行結果
重複を消した結果:
1
2
3
4
5
いかがでしょうか?「2」と「4」が一つずつになり、綺麗に並びましたね。
プログラムの中の numbers.Distinct() という部分が、「重複を消してね!」という魔法の命令です。
4. 文字列(名前など)でも使える!
Distinctは数字だけでなく、文字(文字列)に対しても同じように使えます。 例えば、果物の名前が入ったリストから、何種類の果物があるか調べたい場合を見てみましょう。
サンプルコード:名前の重複を消す
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
// 食べ物の名前が入ったリスト
List<string> fruits = new List<string> { "りんご", "バナナ", "りんご", "みかん", "バナナ" };
// 重複を除いて種類を特定
var result = fruits.Distinct();
foreach (var f in result)
{
Console.WriteLine(f);
}
}
}
実行結果
りんご
バナナ
みかん
このように、文字であっても「内容が全く同じもの」を賢く見つけ出して、一つにまとめてくれます。
5. 注意点:何をもって「同じ」とするか?
ここで少しだけ注意点があります。 コンピューターは非常に几帳面です。 例えば、文字の「A」と「a」は、私たち人間から見れば同じアルファベットですが、コンピューターにとっては「大文字」と「小文字」という全く別のデータとして扱われます。
もし、大文字と小文字も区別せずに重複として消したい場合は、もう少し高度な設定が必要になります。 まずは基本として、「完全に一致するものだけが消える」と覚えておきましょう。
6. 用語解説:初心者向けのキーワード辞典
ここまでに出てきた難しい言葉をおさらいしましょう。
| 用語 | 読み方 | 意味をやさしく説明 |
|---|---|---|
| LINQ | リンク | 大量のデータの中から、必要なものだけを取り出したり加工したりする便利な道具。 |
| Distinct | ディスティンクト | 「同じものは一つにまとめる」というLINQの命令。 |
| List | リスト | データを順番に入れておくための入れ物(箱)。 |
| Query | クエリ | データに対する「問い合わせ」や「命令」のこと。 |
| var | バー | 「どんな種類のデータが入るか、コンピューターに任せるよ」という宣言。 |
7. LINQを使うための準備
C#でDistinctなどのLINQ機能を使うときには、プログラムの冒頭に必ず書かなければならない「おまじない」があります。
それが using System.Linq; です。
これは、「今からLINQという道具箱を使いますよ」とコンピューターに宣言するものです。
もしこれを書き忘れると、Distinct と書いても「そんな命令は知りません」とエラーになってしまいます。
パソコンに慣れていないうちは、この一行を忘れがちなので注意しましょう。
8. まとめとしての補足:Distinctのメリット
Distinctを使う最大のメリットは、「プログラムが短く、読みやすくなる」ことです。 もしDistinctを使わずに重複を消そうとすると、「今のデータがすでに出現したかどうかをチェックして、まだなければ新しいリストに追加して……」という、とても長くて複雑な命令を書かなければなりません。
それがLINQのDistinctを使えば、たった一言付け足すだけで終わります。 これは、プログラミングの世界では「可読性(かどくせい)が高い」と言われ、ミスを減らすためにも非常に重要なことです。
これからC#を学んでいく中で、大量のデータを扱う機会は必ず増えてきます。 そのときに、この「Distinct」という便利な魔法を思い出してください。 バラバラだったデータが、一瞬で美しく整理される快感を味わえるはずです。