Comment peut-on implémenter un IEqualityComparer en VB.NET?
-
06-09-2019 - |
Question
J'ai la fonction suivante qui boucle à travers un répertoire et vérifie un dossier spécifié et le fichier:
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
La raison pour laquelle je l'ai fait cette méthode est que je puisse faire en sorte que les éléments dans chaque liste et le fichier / dossier passé étaient minuscules, sinon je l'aurais fait quelque chose comme ceci:
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
Mon collègue m'a dit quelque chose tout à l'heure au sujet d'être en mesure d'ignorer le cas en utilisant un comparateur. L'extension .Contains
peut avoir un argument comparateur ainsi que la valeur. Je l'ai fait quelques recherches sur Google et MSDN, et est venu avec le comparateur suivant:
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
Quand il arrive à la ligne de theCompare(x.name, y.name) = 0
, il des erreurs sur ce qui est le message d'erreur:
At least one object must implement IComparable.
Quelqu'un sait ce que signifie cette erreur et comment s'y prendre pour la corriger?
La solution
Eh bien, vous pouvez mettre en œuvre un comparateur, mais ce serait la dure dans ce cas. Vous avez un couple d'autres options disponibles à la place.
La première est qu'il existe déjà un comparateur insensible à la casse, vous pouvez utiliser. Il y a un couple en fait. Regardez dans vos invites IntelliSense sous System.StringComparer
.
La seconde est que les chaînes ont déjà intégré un moyen de spécifier la casse comparer:
Dim s As String = "a"
Dim t As String = "A"
If s.Equals(t, StringComparison.InvariantCultureIgnoreCase) Then
''//...
End If
Et un troisième est que tout searchPattern
passé à Directory.GetFiles()
ou Directory.GetDirectories()
est transmis directement au système d'exploitation, et Windows est seulement conscient cas pour les noms de fichiers, pas la casse. Ainsi, vous pouvez passer votre dossier et fichier en tant que modèle de recherche et de faire votre recherche de cette façon.