मेरे पास कुछ कोड हैं:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
मुझे मामले की परवाह नहीं है। मैं का उपयोग करना चाहिए OrdinalIgnoreCase
, InvariantCultureIgnoreCase
या CurrentCultureIgnoreCase
?
मेरे पास कुछ कोड हैं:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
मुझे मामले की परवाह नहीं है। मैं का उपयोग करना चाहिए OrdinalIgnoreCase
, InvariantCultureIgnoreCase
या CurrentCultureIgnoreCase
?
जवाबों:
MSDN की " Microsoft .NET 2.0 में स्ट्रिंग्स का उपयोग करने के लिए नई सिफारिशें "
सारांश:
InvariantCulture
स्ट्रिंग तुलना, आवरण और छँटाई के लिए पहले उपयोग करने वाले कोड मालिकोंString
को Microsoft .NET 2.0 में ओवरलोड के एक नए सेट का उपयोग करने पर दृढ़ता से विचार करना चाहिए । विशेष रूप से, डेटा जिसे संस्कृति-अज्ञेयवादी और भाषाई अप्रासंगिक होने के लिए डिज़ाइन किया गया है , को नई गणना के सदस्योंStringComparison.Ordinal
याStringComparison.OrdinalIgnoreCase
सदस्यों का उपयोग करके ओवरलोड को निर्दिष्ट करना शुरू करना चाहिएStringComparison
। यह एक बाइट-बाय-बाइट तुलना के समान हैstrcmp
जो न केवल अनिवार्य रूप से प्रतीकात्मक तारों की भाषाई व्याख्या से बग से बचा जाता है, बल्कि बेहतर प्रदर्शन प्रदान करता है।
"Straße"
और "STRASSE"
। रिटर्न का उपयोग OrdinalIgnoreCase
करते समय , जबकि वे कहते हैं कि वे समान हैं। Equals
false
InvariantCultureIgnoreCase
यूनिकोड के तारों की तुलना करना कठिन है:
पाठ प्रसंस्करण सॉफ्टवेयर में यूनिकोड स्ट्रिंग खोजों और तुलनाओं के कार्यान्वयन को समान कोड बिंदुओं की उपस्थिति को ध्यान में रखना चाहिए। इस सुविधा की अनुपस्थिति में, एक विशेष कोड बिंदु अनुक्रम की खोज करने वाले उपयोगकर्ता अन्य नेत्रहीन अप्रभेद्य ग्लिफ़ को खोजने में असमर्थ होंगे जिनके पास एक अलग, लेकिन कैनोनिक रूप से समकक्ष, कोड बिंदु प्रतिनिधित्व है।
देखें: http://en.wikipedia.org/wiki/Unicode_equivalence
यदि आप असंवेदनशील तरीके से 2 यूनिकोड स्ट्रिंग्स की तुलना करने की कोशिश कर रहे हैं और चाहते हैं कि यह हर काम करे , तो आपको एक असंभव समस्या है।
क्लासिक उदाहरण तुर्की i है , जो कि बड़े होने पर notice हो जाता है (नोटिस डॉट)
डिफ़ॉल्ट रूप से,। नेट फ्रेमवर्क आमतौर पर स्ट्रिंग संबंधित कार्यों के लिए करंटकल्चर का उपयोग करता है , इसके साथ एक बहुत ही महत्वपूर्ण अपवाद है .Equals
जो ऑर्डिनल (बाइट द्वारा बाइट) तुलना का उपयोग करता है।
यह डिजाइन द्वारा, कंप्यूटर की संस्कृति के आधार पर विभिन्न स्ट्रिंग फ़ंक्शन के लिए अलग-अलग व्यवहार करता है।
बहरहाल, कभी-कभी हम एक "सामान्य उद्देश्य" चाहते हैं, मामला असंवेदनशील, तुलनात्मक।
उदाहरण के लिए, आप अपने स्ट्रिंग तुलना को उसी तरह से व्यवहार करना चाह सकते हैं, इससे कोई फर्क नहीं पड़ता कि आपका एप्लिकेशन किस कंप्यूटर पर स्थापित है।
इसे प्राप्त करने के लिए हमारे पास 3 विकल्प हैं:
यूनिकोड तुल्यता नियम जटिल हैं, जिसका अर्थ है कि विधि 1) या 2) का उपयोग करना अधिक महंगा है OrdinalIgnoreCase
। तथ्य यह है कि OrdinalIgnoreCase
कोई विशेष यूनिकोड सामान्यीकरण नहीं करता है, का अर्थ है कि कुछ तार जो कंप्यूटर स्क्रीन पर उसी तरह प्रस्तुत करते हैं, उन्हें समान नहीं माना जाएगा। उदाहरण के लिए: "\u0061\u030a"
और "\u00e5"
दोनों å रेंडर करते हैं। हालांकि एक क्रमिक तुलना में अलग माना जाएगा।
जो आप चुनते हैं, वह आपके द्वारा बनाए जा रहे एप्लिकेशन पर निर्भर करता है।
Microsoft के पास स्पष्ट दिशानिर्देशों के साथ सिफारिशों का एक सेट है । हालांकि, इन समस्याओं के करीब आने से पहले यूनिकोड तुल्यता की धारणा को समझना वास्तव में महत्वपूर्ण है।
इसके अलावा, कृपया ध्यान रखें कि ऑर्डिनलइग्नोरकैस एक बहुत ही विशेष प्रकार का जानवर है, जो लेक्सिकोग्राफिक पहलुओं में कुछ मिश्रित के साथ थोड़े ऑर्डिनल की तुलना कर रहा है। यह भ्रामक हो सकता है।
यह इस बात पर निर्भर करता है कि आप क्या चाहते हैं, हालाँकि जब तक आप बहुत सुनिश्चित नहीं होंगे कि आप अन्य भाषाओं के लिए कोड का स्थानीयकरण नहीं करना चाहते हैं, तब तक मैं शर्मिंदा हूँ। इसके बजाय CurrentCulture का उपयोग करें।
इसके अलावा, ऑर्डिनलइग्नोरकेस को संख्याओं का सम्मान करना चाहिए, जो आप चाहते हैं या नहीं हो सकते हैं।
बहुत ही सरल उत्तर है, जब तक आप तुर्की का उपयोग नहीं कर रहे हैं, आपको InvariantCulture का उपयोग करने की आवश्यकता नहीं है।
निम्नलिखित लिंक देखें: