我有以下功能,通过一个目录,并检查在指定的文件夹和文件循环:

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.

任何人都知道这是什么错误意味着以及如何去纠正呢?

有帮助吗?

解决方案

那么你可以实现一个比较器,但是这将是在这种情况下,硬盘的方式。你们有几个其他的选择来代替。

首先是已经存在的情况下不敏感的比较器就可以使用。有一对夫妇竟。看看你的智能感知提示下System.StringComparer

第二是串已经有一个内置的方式来指定不区分大小写的比较:

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

和第三个是,任何searchPattern传递给Directory.GetFiles()Directory.GetDirectories()直接传递到操作系统,而Windows是唯一的情况下感知的文件名,不区分大小写。所以,你可以你的文件夹和文件传递的搜索模式,并做你查找的方式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top