जो आमतौर पर उपयोग करने के लिए सबसे अच्छा है - StringComparison.OrdinalIgnoreCase या StringComparison.InvariantCultureIgnoreCase?


161

मेरे पास कुछ कोड हैं:

If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
    DoSomething()
End If

मुझे मामले की परवाह नहीं है। मैं का उपयोग करना चाहिए OrdinalIgnoreCase, InvariantCultureIgnoreCaseया CurrentCultureIgnoreCase?


2
इस धागे के लिए इसकी वास्तव में उपयोगी जाँच करें। तुलना के लिए ordianlignorecase का उपयोग करने का मेरा सुझाव। blogs.msdn.com/b/noahc/archive/2007/06/29/…
UmaMaheswaran


कुल मिलाकर, यह बहुत कुछ निर्भर करता है कि आप किस तरह की चीज़ की तुलना कर रहे हैं। विशेष रूप से, अगर यह संस्कृति-निर्भर उपयोगकर्ता इनपुट या आंतरिक सामान है। आप नहीं चाहते कि आंतरिक कोड स्ट्रिंग की तुलना में पीसी की संस्कृति गड़बड़ हो।
Nyerguds

जवाबों:


179

नए .Net डॉक्स में अब यह तय करने में आपकी मदद करने के लिए एक टेबल है जो आपकी स्थिति में उपयोग करने के लिए सर्वोत्तम है।

MSDN की " Microsoft .NET 2.0 में स्ट्रिंग्स का उपयोग करने के लिए नई सिफारिशें "

सारांश: InvariantCultureस्ट्रिंग तुलना, आवरण और छँटाई के लिए पहले उपयोग करने वाले कोड मालिकों Stringको Microsoft .NET 2.0 में ओवरलोड के एक नए सेट का उपयोग करने पर दृढ़ता से विचार करना चाहिए । विशेष रूप से, डेटा जिसे संस्कृति-अज्ञेयवादी और भाषाई अप्रासंगिक होने के लिए डिज़ाइन किया गया है , को नई गणना के सदस्यों StringComparison.Ordinalया StringComparison.OrdinalIgnoreCaseसदस्यों का उपयोग करके ओवरलोड को निर्दिष्ट करना शुरू करना चाहिए StringComparison। यह एक बाइट-बाय-बाइट तुलना के समान है strcmpजो न केवल अनिवार्य रूप से प्रतीकात्मक तारों की भाषाई व्याख्या से बग से बचा जाता है, बल्कि बेहतर प्रदर्शन प्रदान करता है।


126
एक उदाहरण देने के लिए कि वे कहां भिन्न हैं, दो तारों पर विचार करें "Straße"और "STRASSE"। रिटर्न का उपयोग OrdinalIgnoreCaseकरते समय , जबकि वे कहते हैं कि वे समान हैं। EqualsfalseInvariantCultureIgnoreCase
जेपी स्टिग नीलसन


64

यह सब निर्भर करता है

यूनिकोड के तारों की तुलना करना कठिन है:

पाठ प्रसंस्करण सॉफ्टवेयर में यूनिकोड स्ट्रिंग खोजों और तुलनाओं के कार्यान्वयन को समान कोड बिंदुओं की उपस्थिति को ध्यान में रखना चाहिए। इस सुविधा की अनुपस्थिति में, एक विशेष कोड बिंदु अनुक्रम की खोज करने वाले उपयोगकर्ता अन्य नेत्रहीन अप्रभेद्य ग्लिफ़ को खोजने में असमर्थ होंगे जिनके पास एक अलग, लेकिन कैनोनिक रूप से समकक्ष, कोड बिंदु प्रतिनिधित्व है।

देखें: http://en.wikipedia.org/wiki/Unicode_equivalence


यदि आप असंवेदनशील तरीके से 2 यूनिकोड स्ट्रिंग्स की तुलना करने की कोशिश कर रहे हैं और चाहते हैं कि यह हर काम करे , तो आपको एक असंभव समस्या है।

क्लासिक उदाहरण तुर्की i है , जो कि बड़े होने पर notice हो जाता है (नोटिस डॉट)

डिफ़ॉल्ट रूप से,। नेट फ्रेमवर्क आमतौर पर स्ट्रिंग संबंधित कार्यों के लिए करंटकल्चर का उपयोग करता है , इसके साथ एक बहुत ही महत्वपूर्ण अपवाद है .Equalsजो ऑर्डिनल (बाइट द्वारा बाइट) तुलना का उपयोग करता है।

यह डिजाइन द्वारा, कंप्यूटर की संस्कृति के आधार पर विभिन्न स्ट्रिंग फ़ंक्शन के लिए अलग-अलग व्यवहार करता है।


बहरहाल, कभी-कभी हम एक "सामान्य उद्देश्य" चाहते हैं, मामला असंवेदनशील, तुलनात्मक।

उदाहरण के लिए, आप अपने स्ट्रिंग तुलना को उसी तरह से व्यवहार करना चाह सकते हैं, इससे कोई फर्क नहीं पड़ता कि आपका एप्लिकेशन किस कंप्यूटर पर स्थापित है।

इसे प्राप्त करने के लिए हमारे पास 3 विकल्प हैं:

  1. संस्कृति को स्पष्ट रूप से सेट करें और यूनिकोड तुल्यता नियमों का उपयोग करते हुए असंवेदनशील तुलना करें।
  2. Invariant कल्चर को संस्कृति सेट करें और यूनिकोड तुल्यता नियमों का उपयोग करते हुए असंवेदनशील तुलना करें।
  3. OrdinalIgnoreCase का उपयोग करें जो कि InvariantCulture का उपयोग करके स्ट्रिंग को बड़ा करेगा और फिर बाइट तुलना करके एक बाइट का प्रदर्शन करेगा।

यूनिकोड तुल्यता नियम जटिल हैं, जिसका अर्थ है कि विधि 1) या 2) का उपयोग करना अधिक महंगा है OrdinalIgnoreCase। तथ्य यह है कि OrdinalIgnoreCaseकोई विशेष यूनिकोड सामान्यीकरण नहीं करता है, का अर्थ है कि कुछ तार जो कंप्यूटर स्क्रीन पर उसी तरह प्रस्तुत करते हैं, उन्हें समान नहीं माना जाएगा। उदाहरण के लिए: "\u0061\u030a"और "\u00e5"दोनों å रेंडर करते हैं। हालांकि एक क्रमिक तुलना में अलग माना जाएगा।

जो आप चुनते हैं, वह आपके द्वारा बनाए जा रहे एप्लिकेशन पर निर्भर करता है।

  • अगर मैं एक लाइन-ऑफ-बिजनेस ऐप लिख रहा था जो केवल तुर्की उपयोगकर्ताओं द्वारा उपयोग किया जाता था, तो मुझे विधि 1 का उपयोग करना सुनिश्चित होगा।
  • अगर मुझे सिर्फ एक साधारण "नकली" केस असंवेदनशील तुलना की आवश्यकता है, तो एक db में एक कॉलम नाम के लिए, जो आमतौर पर अंग्रेजी है मैं शायद विधि 3 का उपयोग करूंगा।

Microsoft के पास स्पष्ट दिशानिर्देशों के साथ सिफारिशों का एक सेट है । हालांकि, इन समस्याओं के करीब आने से पहले यूनिकोड तुल्यता की धारणा को समझना वास्तव में महत्वपूर्ण है।

इसके अलावा, कृपया ध्यान रखें कि ऑर्डिनलइग्नोरकैस एक बहुत ही विशेष प्रकार का जानवर है, जो लेक्सिकोग्राफिक पहलुओं में कुछ मिश्रित के साथ थोड़े ऑर्डिनल की तुलना कर रहा है। यह भ्रामक हो सकता है।


क्या होगा अगर मैं एक तुर्की ऐप बना रहा हूँ जो केवल तुर्की उपयोगकर्ताओं द्वारा उपयोग किया जाएगा लेकिन मैं "ayakkabı" और "ayakkabi" को समान होना चाहता हूं, क्या कोई रास्ता है? जब लोग अपने फोन पर टाइप करते हैं, तो उनमें से अधिकांश डिफ़ॉल्ट रूप में अंग्रेजी कीबोर्ड का उपयोग करते हैं और परवाह नहीं करते हैं कि क्या वे "ı" या "i" टाइप करते हैं।
Volkan Sen

4

मुझे लगता है कि यह आपकी स्थिति पर निर्भर करता है। चूंकि ऑर्डिनल तुलना वास्तव में पात्रों के संख्यात्मक यूनिकोड मूल्यों को देख रहे हैं, इसलिए जब आप वर्णानुक्रम में छंटनी कर रहे हों तो वे सबसे अच्छा विकल्प नहीं होंगे। तार तुलना के लिए, हालांकि, अध्यादेश तेजी से एक बालक होगा।


1

यह इस बात पर निर्भर करता है कि आप क्या चाहते हैं, हालाँकि जब तक आप बहुत सुनिश्चित नहीं होंगे कि आप अन्य भाषाओं के लिए कोड का स्थानीयकरण नहीं करना चाहते हैं, तब तक मैं शर्मिंदा हूँ। इसके बजाय CurrentCulture का उपयोग करें।

इसके अलावा, ऑर्डिनलइग्नोरकेस को संख्याओं का सम्मान करना चाहिए, जो आप चाहते हैं या नहीं हो सकते हैं।


1
कभी मिश्रित भाषा के माहौल में VB6 कोड लिखा है? आप ऐसे कोड बना सकते हैं जो एक पीसी पर फ्रेंच लोकेल के साथ संकलित करते हैं, लेकिन अंग्रेजी लोकेल के साथ पीसी पर संकलन नहीं करेंगे, क्योंकि फॉर्म संसाधनों में संग्रहीत कोई भी संख्या वर्तमान लोकेल के प्रारूप का उपयोग करती है। मेरा तर्क है कि आपको विपरीत दृष्टिकोण अपनाने की आवश्यकता है: जब आप वर्तमान संस्कृति का उपयोग करते हैं तो बहुत सावधान रहें। हमेशा इस बारे में सोचें कि क्या आपका सिस्टम तब भी काम करेगा जब उसका डेटा संस्कृतियों के बीच चलता है। टाइमज़ोन के साथ एक ही बात।
विम कोएनेन

मैं "यह निर्भर करता है" जवाब से सहमत हूं। हालांकि "सम्मान संख्या" बिट का पालन नहीं?
सैम केसर

-1

बहुत ही सरल उत्तर है, जब तक आप तुर्की का उपयोग नहीं कर रहे हैं, आपको InvariantCulture का उपयोग करने की आवश्यकता नहीं है।

निम्नलिखित लिंक देखें:

C # में ToUpper () और ToUpperInvariant () में क्या अंतर है?


5
यह उत्तर सरल हो सकता है, लेकिन यह बहुत गलत भी है। तुर्की "आई" सिर्फ एक उदाहरण है , कई और संभावित नुकसान हैं।
ओहद श्नाइडर

कौन से नुकसान? मैं सिर्फ तुर्की समस्या के मामले के बारे में जानता हूं।
हैलोवर्ल्ड

हाँ, तुर्की के अलावा Azeri है। लेकिन इतना ही।
जिम बाल्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.