Как реализовать IEqualityComparer<T> в VB.NET?
У меня есть следующая функция, которая просматривает каталог и проверяет наличие указанной папки и файла:
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.
Кто-нибудь знает, что означает эта ошибка и как ее исправить?
1 ответ
Ну, вы могли бы реализовать компаратор, но в этом случае это будет трудный путь. Вместо этого у вас есть пара других вариантов.
Во-первых, уже есть компаратор без учета регистра, который вы можете использовать. Есть пара на самом деле. Посмотрите в ваших подсказках intellisense под 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 учитывает только имена файлов, без учета регистра. Таким образом, вы можете передать свою папку и файл в качестве шаблона поиска и выполнить поиск таким образом.