どのようにVB.NETにされたIEqualityComparer を実装していますか?
-
06-09-2019 - |
質問
私は、指定したフォルダとファイルのディレクトリとチェックをループし、次の機能を持っています
Private Function VerifyPath(ByVal root As String, ByVal folder As String, _
ByVal file As String) As Boolean
Dim folders As New List(Of String), files As New List(Of String)
Dim oDir As New IO.DirectoryInfo(root)
For Each dir As IO.DirectoryInfo In oDir.GetDirectories
folders.Add(dir.Name.ToLower)
Next
If folders.Contains(folder) Then
For Each item As IO.FileInfo In oDir.GetFiles
files.Add(item.Name.ToLower)
Next
If files.Contains(file) Then
Return True
End If
End If
Return False
End Function
私はこの方法をした理由は、そうでない場合、私はこのような何かをやっているだろうので、私は、各リストの項目と渡されたファイル/フォルダはすべて小文字だったことを確認してください可能性があります
If oDir.GetDirectories.Contains( _
New IO.DirectoryInfo(String.Format("{0}\{1}", root, folder))) Then
If oDir.GetFiles.Contains( _
New IO.FileInfo(String.Format("{0}\{1}", root, file))) Then
Return True
End If
End If
Return False
私の同僚は、比較子を使用してケースを無視することができることについては、以前の私に何かを述べました。 .Contains
拡張子は値とともに比較演算子の引数を持つことができます。私はGoogleとMSDNにいくつかの検索を行なったし、次の比較演算子を思い付います:
Public Class dirCompare
Implements IEqualityComparer(Of IO.DirectoryInfo)
Dim theCompare As CaseInsensitiveComparer
Sub New()
theCompare = CaseInsensitiveComparer.DefaultInvariant
End Sub
Sub New(ByVal culture As CultureInfo)
theCompare = New CaseInsensitiveComparer(culture)
End Sub
Public Function Equals1(ByVal x As System.IO.DirectoryInfo, ByVal y As System.IO.DirectoryInfo) As Boolean Implements System.Collections.Generic.IEqualityComparer(Of System.IO.DirectoryInfo).Equals
If theCompare.Compare(x.name, y.name) = 0 Then
Return True
Else
Return False
End If
End Function
Public Function GetHashCode1(ByVal obj As System.IO.DirectoryInfo) As Integer Implements System.Collections.Generic.IEqualityComparer(Of System.IO.DirectoryInfo).GetHashCode
Return obj.ToString.ToLower.GetHashCode
End Function
End Class
それはそれは、theCompare(x.name, y.name) = 0
ラインにエラーを取得し、これはエラーメッセージのときます:
At least one object must implement IComparable.
誰でもこのエラーが何を意味するのか、それを修正について移動する方法を知っていますか?
解決
さてあなたは、比較演算を実装することができ、それは、この場合、ハードな方法だろう。あなたは代わりに利用できるカップルの他のオプションを持っています。
最初は、あなたが使用することができ、大文字と小文字を区別しない比較演算子がすでに存在することです。実際にいくつかあります。 System.StringComparer
の下であなたのインテリセンスプロンプトで探します。
二つ目は、文字列が既に指定する組み込みの方法を持っているということである大文字と小文字を区別しない比較ます:
Dim s As String = "a"
Dim t As String = "A"
If s.Equals(t, StringComparison.InvariantCultureIgnoreCase) Then
''//...
End If
そして第三には、任意のsearchPattern
がDirectory.GetFiles()
に渡されたかDirectory.GetDirectories()
は、オペレーティングシステムに直接渡され、Windowsのみの場合を意識したファイル名、大文字と小文字を区別しないためであるということです。だから、検索パターンとして、あなたのフォルダやファイルを渡すと、そのように、あなたの検索を行うことができます。