كيف تنفذ Iequalitycompareer في 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
يمكن أن يكون التمديد حجة مقارنة جنبا إلى جنب مع القيمة. فعلت بعض البحث على 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()
يتم تمريرها مباشرة إلى نظام التشغيل، ويندوز ليست سوى كحرف تدرك أسماء الملفات، وليس حساسة لحالة الأحرف. حتى تتمكن من اجتياز المجلد والملف كأنما نمط بحث وقم بإجراء بحثك بهذه الطريقة.