2009-04-08 68 views
1

我有以下的功能,通過一個目錄,並檢查是否有指定的文件夾和文件的循環:如何在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.

任何人都知道這個錯誤的含義以及如何糾正它?

回答

2

那麼你可以實現一個比較器,但這將是在這種情況下的困難方式。您可以使用其他一些選項。

第一個是已經有一個可以使用的不區分大小寫的比較器。實際上有一對夫婦。請在System.StringComparer下查看您的智能感知提示。

二是串已經有一個內置的方式來指定不區分大小寫的比較:

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

而且第三是傳遞給Directory.GetFiles()Directory.GetDirectories()任何searchPattern直接傳遞給操作系統,而且Windows只能識別文件名,而不區分大小寫。因此,您可以將您的文件夾和文件作爲搜索模式傳遞​​,並以這種方式進行查找。

+0

我想我可以做一些簡單的事情,但因爲我是新來的,所以我想確定一下。感謝Joel ...你在VB中提供課程嗎? ;) – Anders 2009-04-08 13:59:59

相關問題