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内の重複チェック、及び、
重複データの削除ができるようになりました。