你怎么实现的IEqualityComparer 在VB.NET?
-
06-09-2019 - |
题
我有以下功能,通过一个目录,并检查在指定的文件夹和文件循环:
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是唯一的情况下感知的文件名,不区分大小写。所以,你可以你的文件夹和文件传递的搜索模式,并做你查找的方式。
不隶属于 StackOverflow