我有以下的功能,通過一個目錄,並檢查是否有指定的文件夾和文件的循環:如何在VB.NET中實現IEqualityComparer <T>?
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.
任何人都知道這個錯誤的含義以及如何糾正它?
我想我可以做一些簡單的事情,但因爲我是新來的,所以我想確定一下。感謝Joel ...你在VB中提供課程嗎? ;) – Anders 2009-04-08 13:59:59