VB.NET List 重複チェックと削除

List内に重複したデータがあるかチェックする方法をご紹介します。

HashSetを使う方法

Imports System
Imports System.Collections.Generic

Dim list() As String = New String() {"りんご", "バナナ", "オレンジ",
                                     "りんご", "ぶどう", "オレンジ"}
Dim hash = New HashSet(Of String)

For Each d In list
    If (hash.Add(d) = False) Then
        Console.WriteLine("{0}は重複しています。", d)
    End If
Next
りんごは重複しています。
オレンジは重複しています。

HashSetは、Dictionaryのキーだけバージョンのような使い方ができます。

つまり、同じキーの値は追加できないルールになっています。

そして、HashSetで項目を追加するAddメソッドですが、
重複したデータを追加しようとすると、追加されず、Falseが返ります。
(重複しないデータを追加するとTrueが返ります。)

これを利用してリストの重複チェックができると言うワケです。

非常にシンプルでコード量も少ないので、オススメの方法です。

ちなみにDictionaryのAddメソッドで、重複したデータを追加しようとすると、
例外が発生するので、処理が面倒になります。

ループで調べる方法

' リスト
Dim list() As String = New String() {"りんご", "バナナ", "オレンジ",
                                     "りんご", "ぶどう", "オレンジ"}
Dim i As Integer = 0
Dim j As Integer = 0

For i = 0 To list.Count - 1
    For j = i + 1 To (list.Count - 1)
        If (list(i).Equals(list(j))) Then
            Console.WriteLine("{0}は重複しています。", list(j))
            Exit For
        End If
    Next
Next
りんごは重複しています。
オレンジは重複しています。

ListのEqualsメソッドで比較を行い、
ループを使ってゴリゴリ書いていけば重複チェックはできますが、
コードがシンプルではありませんし、
保守性も優れているとは言えないと思います。

さらに処理速度面でも疑問です。

スポンサーリンク

重複データを削除する方法

List内の重複データを削除する方法もあります。

' リスト
Dim list() As String = New String() {"りんご", "バナナ", "オレンジ",
                                     "りんご", "ぶどう", "オレンジ"}
Dim ret As IEnumerable(Of String) = list.Distinct()
Dim newlist As List(Of String) = ret.ToList()

For Each d In newlist
    Console.WriteLine(d)
Next
りんご
バナナ
オレンジ
ぶどう

List内の重複データを削除したい場合には、
Distinctメソッドを使います。

戻り値は、IEnumerable型を返します。
IEnumerableについて詳しく知る必要はありません。

あとは、ToListメソッドを使い、リストに変換すれば、
重複データが削除された新しいリストが得られます。

変換する部分を1行で書く事もできます。

Dim newlist = list.Distinct().ToList()



これでList内の重複チェック、及び、
重複データの削除ができるようになりました。