Frage

Ich habe die folgende Funktion, die für einen bestimmten Ordner und die Datei ein Verzeichnis und prüft Schleifen durch:

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

Der Grund, warum ich diese Methode tat, ist, so konnte ich sicher, dass die Elemente in jeder Liste und die übergebene Datei / Ordner waren alle Kleinbuchstaben, sonst hätte ich so etwas getan haben:

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

Mein Kollege erwähnte mir etwas früher über die Möglichkeit, Fall zu ignorieren, indem eine Vergleich. Die .Contains Erweiterung kann einen Vergleich Argument zusammen mit dem Wert. Ich habe einige der Suche auf Google und MSDN, und kam mit dem folgenden Vergleich auf:

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

Wenn es wird auf die theCompare(x.name, y.name) = 0 Linie, es Fehler aus und das ist die Fehlermeldung:

  

At least one object must implement IComparable.

Wer weiß, was dieser Fehler bedeutet und wie etwa die Korrektur es gehen?

War es hilfreich?

Lösung

Nun könnte man einen Vergleich implementieren, aber das würde die harte Art und Weise in diesem Fall sein. Sie haben ein paar andere Optionen stattdessen zur Verfügung.

Die erste ist, dass es bereits ein Groß- und Kleinschreibung Vergleich Sie verwenden können. Es gibt tatsächlich ein Paar. Schauen Sie in Ihren intellisense Aufforderungen unter System.StringComparer.

Die zweite ist, dass Strings haben bereits eine eingebaute Möglichkeit, ein Groß- und Kleinschreibung vergleichen angeben:

Dim s As String = "a"
Dim t As String = "A"
If s.Equals(t, StringComparison.InvariantCultureIgnoreCase) Then
   ''//...
End If

Und ein drittes ist, dass jede searchPattern weitergegeben Directory.GetFiles() oder Directory.GetDirectories() wird direkt an das Betriebssystem übergeben, und Windows ist nur fall bewusst für Dateinamen, nicht zwischen Groß- und Kleinschreibung unterscheidet. So können Sie Ihre Ordner und die Datei als Suchmuster übergeben und tun Sie Ihre Lookup auf diese Weise.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top