1

ディレクトリをループして、指定されたフォルダとファイルをチェックする次の関数があります。

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、値とともに比較引数を持つことができます。私はグーグルと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.

このエラーの意味と修正方法を知っている人はいますか?

4

1 に答える 1

2

比較子を実装することもできますが、この場合は難しい方法です。代わりに、他のいくつかのオプションを利用できます。

1 つ目は、使用できる大文字と小文字を区別しない比較子が既に存在することです。実際にカップルがいます。の下の Intellisense プロンプトを見てくださいSystem.StringComparer

2 つ目は、文字列には、大文字と小文字を区別しない比較を指定する組み込みの方法が既にあるということです。

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

3 つ目は、オペレーティング システムにsearchPattern渡されるもの、Directory.GetFiles()またはDirectory.GetDirectories()オペレーティング システムに直接渡されるものであり、Windows はファイル名の大文字と小文字のみを認識し、大文字と小文字を区別しません。そのため、フォルダーとファイルを検索パターンとして渡し、その方法でルックアップを行うことができます。

于 2009-04-08T13:51:24.670 に答える