English 中文(简体)
如何在VB.NET中实现IEqualityComparer<T>?
原标题:
  • 时间:2009-04-08 13:26:09
  •  标签:

我有以下函数,它在目录中循环并检查指定的文件夹和文件:

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

我的同事早些时候向我提到了可以通过使用比较器来忽略case。.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

当它到达Compare(x.name,y.name)=0行时,它会出错,这是错误消息:

<code>必须至少有一个对象实现IComparable

有人知道这个错误意味着什么,以及如何纠正它吗?

最佳回答

好吧,你可以实现一个比较器,但在这种情况下,这将是困难的方法。您可以选择其他几个选项。

首先,您可以使用一个不区分大小写的比较器。实际上有一对。查看System.StringComparer下的intellisense提示。

第二个原因是字符串已经有了一种内置的方法来指定不区分大小写的比较:

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

第三个是,传递给Directory.GetFiles()Directory.GetDirectory()的任何searchPattern都会直接传递给操作系统,Windows只对文件名区分大小写,不区分大小写。因此,您可以将文件夹和文件作为搜索模式进行传递,并以这种方式进行查找。

问题回答

暂无回答




相关问题
热门标签