Come è possibile realizzare un IEqualityComparer in VB.NET?
-
06-09-2019 - |
Domanda
Ho la seguente funzione che scorre una directory e controlli per una cartella e file specificato:
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
Il motivo per cui ho fatto questo metodo è così ho potuto fare in modo che i prodotti in ciascuna lista e il file / cartella passato erano tutti in minuscolo, altrimenti avrei fatto qualcosa di simile:
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
Il mio collega accennato qualcosa a me in precedenza di essere in grado di ignorare caso utilizzando un operatore di confronto. L'estensione .Contains
può avere un argomento di confronto con il valore. Ho fatto qualche ricerca su Google e MSDN, e si avvicinò con il seguente di confronto:
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
Quando si arriva alla linea theCompare(x.name, y.name) = 0
, esso errori fuori e questo è il messaggio di errore:
At least one object must implement IComparable.
Chiunque sa che cosa significa questo errore e come fare per correggerlo?
Soluzione
Beh si potrebbe implementare un operatore di confronto, ma che sarebbe il modo più difficile in questo caso. Hai un paio di altre opzioni disponibili, invece.
La prima è che c'è già un operatore di confronto tra maiuscole e minuscole è possibile utilizzare. Ci sono un paio in realtà. Guarda nel tuo istruzioni IntelliSense sotto System.StringComparer
.
La seconda è che le stringhe già hanno un modo integrato per specificare un case-insensitive confrontare:
Dim s As String = "a"
Dim t As String = "A"
If s.Equals(t, StringComparison.InvariantCultureIgnoreCase) Then
''//...
End If
E un terzo è che qualsiasi searchPattern
passato a Directory.GetFiles()
o Directory.GetDirectories()
viene passata direttamente al sistema operativo, e Windows è unico caso-aware per i nomi di file, non maiuscole e minuscole. Così si può passare la cartella e file come un modello di ricerca e fare la tua ricerca in questo modo.