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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top