目次
はじめに
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 ドキュメント
関連記事
【C#】 LINQ の各メソッドの紹介と使い方まとめ(Select, Where など)【 C# 】文字列を連結させる6つの方法【StringBuilder, Joinなど】