वस्तुओं के एक अनियंत्रित संग्रह में नाम संपत्ति के आधार पर अगली वस्तु को खोजने के लिए मेरे पास एक साधारण दिनचर्या है। मैं संग्रह के माध्यम से जाता हूं और सभी नामों को List(of String)
में जोड़ता हूं जो कि >
मेरा वर्तमान नाम है, जो वर्तमान कुंजी के बाद आने वाली हर चीज की एक सूची देनी चाहिए। मैं फिर List(of String)
पर डिफ़ॉल्ट .Sort()
विधि का उपयोग करके सूची को सॉर्ट करता हूं और सूची में पहला आइटम लेता हूं, जो मेरा अगला आइटम होना चाहिए। मैं पिछले आइटम को खोजने के लिए उल्टा करता हूं, सभी आइटम जोड़ें <
मेरा वर्तमान नाम, सॉर्ट करें, और सूची में अंतिम आइटम लें।
हालाँकि, यह विधि कुछ वस्तुओं को छोड़ देती है। उदाहरण के लिए मेरे पास 1210, 1210-एडीए, और 1210_एडीए_डीबी नामक आइटम हैं। इस पद्धति का उपयोग करते हुए, अगला आइटम प्राप्त करना मध्य आइटम 1210-ADA को छोड़ देता है और 1210_ADA_DB पाता है, लेकिन पिछले आइटम को ढूंढना काम करने लगता है।
अगर मेरी प्रक्रिया सही है, तो मेरा एकमात्र स्पष्टीकरण यह है कि <
और >
ऑपरेटर .Sort()
विधि से अलग तुलना करते हैं। क्या ये सच है? क्या अंतर हैं?
अगला आइटम खोजने के लिए कोड:
Dim Key As String = Name
Dim NameList As New List(Of String)
For Each obj As T In Collection
Dim ObjKey As String = Obj.Key
If ObjKey > Key Then
NameList.Add(ObjKey)
End If
Next
If NameList.Count = 0 Then Return Nothing
NameList.Sort()
Dim NextKey As String = NameList.First
2 जवाब
मुझे लगता है कि आपको पहले ही पता चल गया है कि समस्या क्या हो सकती है। लेकिन टिप्पणी करने के लिए, आप कुछ VB6 संगत व्यवहार से काटे जा रहे हैं। विकल्प तुलना के लिए डिफ़ॉल्ट बाइनरी है जो String.CompareOrdinal() का उपयोग करता है। List.Sort() क्या उपयोग नहीं करता है। विकल्प तुलना टेक्स्ट का उपयोग करता है CultureInfo.CompareInfo.Compare() के साथ CompareOptions.IgnoreWidth, ComparOptions.IgnoreKanaType, ComparOptions.IgnoreCase विकल्प यह भी नहीं कि List.Sort() क्या उपयोग करता है।
ऑपरेटरों से बचें और इसके बजाय String.Compare() का उपयोग करें।
मेरा एकमात्र स्पष्टीकरण यह है कि < और > ऑपरेटर .Sort() विधि से अलग तुलना करते हैं। क्या ये सच है?
नहीं. Sort
आंतरिक रूप से String.IComparable(Of String).CompareTo
का उपयोग करता है विधि जो <
और >
के अनुरूप परिणाम देती है।
हालांकि, यह तभी तक सही है जब तक आपने Option Compare
प्रोजेक्ट या मौजूदा फ़ाइल के लिए। यह <
और >
के व्यवहार को बदल देगा लेकिन ऊपर बताए गए तरीके का नहीं।
CompareTo
के लिए प्रलेखन कहता है This method performs a word (case-sensitive and culture-sensitive) comparison using the current culture.
और Option Compart Text
कहते हैं bases string comparisons on a case-insensitive, textual sort order determined by your application's locale.
Option Compare Text
के लिए मायने रखता है। Option Compare Binary
के अंतर्गत वे समान व्यवहार करते हैं (केस-संवेदी, संस्कृति-संवेदी)।
Option Compare Binary bases string comparisons on a sort order derived from the internal binary representations of the characters.
, साथ ही अब जब मुझे पता है कि मेरी परियोजना binary
के लिए निर्धारित है, मेरे कोड का व्यवहार साबित करता है कि वे अलग हैं। मेरे उदाहरण में -
, _
से अलग तुलना कर रहा था। मैंने >
को String.Compare से बदल दिया (इसलिए यह उसी तरह से तुलना करता है) और यह अब अच्छा काम कर रहा है।
संबंधित सवाल
नए सवाल
.net
.NET कोर के बारे में प्रश्नों के लिए उपयोग न करें - इसके बजाय [.net-core] का उपयोग करें। .NET फ्रेमवर्क मुख्य रूप से माइक्रोसॉफ्ट विंडोज ऑपरेटिंग सिस्टम के लिए डिज़ाइन किया गया एक सॉफ्टवेयर फ्रेमवर्क है। इसमें बेस क्लास लाइब्रेरी, कॉमन लैंग्वेज रनटाइम (आमतौर पर सीएलआर के रूप में संदर्भित), कॉमन टाइप सिस्टम (आमतौर पर सीटीएस के रूप में संदर्भित) और डायनेमिक भाषा रनटाइम का कार्यान्वयन शामिल है। यह C #, VB.NET, F # और C ++ / CLI सहित कई प्रोग्रामिंग भाषाओं का समर्थन करता है।