【C#】要素に重複のないリストを作成する3つの方法【List】

【C#】要素に重複のないリストを作成する3つの方法

はじめに

List<T> クラスを扱う際に要素に重複がないデータを管理したい場合があります。ただ現状の List クラスは重複する要素の追加が可能です。

var list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
list.Add(1); // 要素の重複が可能

Debug.Log(string.Join(",", list));
// => 1,2,3,1

本記事では、要素に重複のないリストを作成するための3つの方法を紹介します。

List<T> を使用する際は using ステートメントで以下を宣言する必要があります。

using System.Collections.Generic;

1. 要素の追加前に List<T>.Contains(T) で判定する

定番ですが List<T>.Contains(T)を使うことでリストの要素重複を防ぐことが可能です。

リストに要素を追加する際に Contains を使うことで、既にリスト内に要素が存在するかを判定できます。False なら要素が存在しないので、その時のみリストに追加します。

var list = new List<int>();

var numbers = new int[] { 1, 2, 3, 1 };
foreach (var num in numbers)
{
    // リストに要素が無ければ追加
    if (!list.Contains(num))
    {
        list.Add(num);
    }
}

Debug.Log(string.Join(",", list));
// => 1,2,3
参考 List<T>.Contains(T) メソッドMicrosoft ドキュメント

2. HashSet<T> クラスを使う

HashSet<T>要素の重複を許さないコレクションクラスです。

HashSet に{ 1, 2, 3, 1 }と要素を追加しても、実際にコレクション内に登録されるのは重複を除いた{ 1, 2, 3 }のみとなります。

var numbers = new HashSet<int>();
numbers.Add(1);
numbers.Add(2);
numbers.Add(3);
numbers.Add(1);

Debug.Log(string.Join(",", numbers));
// => 1,2,3

using ステートメントに using System.Linq;を宣言することで、HasSet に対して ToList() も可能になるため、リスト型への変更もできます。

参考 HashSet<T> クラスMicrosoft ドキュメント

3. LINQ の Distinct メソッドを使う

LINQ の Distinct メソッドを使用することで、リストに対して重複する要素を削除できます。LINQ の使用には using System.Linq; の宣言が必要です。

using UnityEngine;
using System.Collections.Generic;
using System.Linq; // LINQ の使用に必要

public class SampleClass : MonoBehaviour
{
    void Start()
    {
        var list = new List<int>();
        list.Add(1);
        list.Add(2);
        list.Add(3);
        list.Add(1);

        Debug.Log(string.Join(",", list));
        // => 1,2,3,1

        // 重複する要素を削除
        var uniqueList = list.Distinct();
        Debug.Log(string.Join(",", uniqueList));
        // => 1,2,3
    }
}
参考 Enumerable.Distinct メソッドMicrosoft ドキュメント

LINQ について知りたい方はこちらの記事も参考にして下さい。

Linqメソッド簡易解説&使い方まとめ 【C#】 LINQ のメソッド簡易解説 & 使い方まとめ【Unity】