वस्तुओं के एक अनियंत्रित संग्रह में नाम संपत्ति के आधार पर अगली वस्तु को खोजने के लिए मेरे पास एक साधारण दिनचर्या है। मैं संग्रह के माध्यम से जाता हूं और सभी नामों को 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
0
Kratz 28 सितंबर 2011, 18:59
2
अपने कोड का वर्णन करने के बजाय, आप अपना कोड पोस्ट क्यों नहीं करते?
 – 
Jon Skeet
28 सितंबर 2011, 19:03

2 जवाब

सबसे बढ़िया उत्तर

मुझे लगता है कि आपको पहले ही पता चल गया है कि समस्या क्या हो सकती है। लेकिन टिप्पणी करने के लिए, आप कुछ VB6 संगत व्यवहार से काटे जा रहे हैं। विकल्प तुलना के लिए डिफ़ॉल्ट बाइनरी है जो String.CompareOrdinal() का उपयोग करता है। List.Sort() क्या उपयोग नहीं करता है। विकल्प तुलना टेक्स्ट का उपयोग करता है CultureInfo.CompareInfo.Compare() के साथ CompareOptions.IgnoreWidth, ComparOptions.IgnoreKanaType, ComparOptions.IgnoreCase विकल्प यह भी नहीं कि List.Sort() क्या उपयोग करता है।

ऑपरेटरों से बचें और इसके बजाय String.Compare() का उपयोग करें।

1
Hans Passant 28 सितंबर 2011, 19:57

मेरा एकमात्र स्पष्टीकरण यह है कि < और > ऑपरेटर .Sort() विधि से अलग तुलना करते हैं। क्या ये सच है?

नहीं. Sort आंतरिक रूप से String.IComparable(Of String).CompareTo का उपयोग करता है विधि जो < और > के अनुरूप परिणाम देती है।

हालांकि, यह तभी तक सही है जब तक आपने Option Compare प्रोजेक्ट या मौजूदा फ़ाइल के लिए। यह < और > के व्यवहार को बदल देगा लेकिन ऊपर बताए गए तरीके का नहीं।

1
Konrad Rudolph 28 सितंबर 2011, 19:05
मैंने विकल्प तुलना नहीं बदला है। मेरी परियोजना सेटिंग्स के अनुसार विकल्प तुलना बाइनरी पर सेट है, जो मुझे लगता है कि डिफ़ॉल्ट है।
 – 
Kratz
28 सितंबर 2011, 19:15
आपने मुझे मेरे उत्तर तक पहुँचाया है, लेकिन < और > जाहिरा तौर पर अभी भी String.CompartTo से अलग हैं, 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.
 – 
Kratz
28 सितंबर 2011, 19:30
आपने जो उद्धृत किया है वह केवल Option Compare Text के लिए मायने रखता है। Option Compare Binary के अंतर्गत वे समान व्यवहार करते हैं (केस-संवेदी, संस्कृति-संवेदी)।
 – 
Konrad Rudolph
28 सितंबर 2011, 19:42
Option Compare Binary bases string comparisons on a sort order derived from the internal binary representations of the characters., साथ ही अब जब मुझे पता है कि मेरी परियोजना binary के लिए निर्धारित है, मेरे कोड का व्यवहार साबित करता है कि वे अलग हैं। मेरे उदाहरण में -, _ से अलग तुलना कर रहा था। मैंने > को String.Compare से बदल दिया (इसलिए यह उसी तरह से तुलना करता है) और यह अब अच्छा काम कर रहा है।
 – 
Kratz
28 सितंबर 2011, 19:47