vb.net에서 iequalitycomparer 를 어떻게 구현합니까?
-
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
확장자는 값과 함께 비교 인수를 가질 수 있습니다. 나는 Google과 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는 파일 이름에 대한 대변인 일뿐 아니라 사례에 민감하지 않습니다. 따라서 폴더와 파일을 검색 패턴으로 전달하고 그런 식으로 조회 할 수 있습니다.