2009-03-10 7 views
131

मुझे पता है कि निम्न केस संवेदी है:क्या कोई सी # केस असंवेदनशील बराबर ऑपरेटर है?

if (StringA == StringB) { 

तो वहाँ एक ऑपरेटर जो एक असंवेदनशील तरीके से दो तार की तुलना करेंगे है?

+0

की [Caselessly सी # में तार की तुलना] संभव डुप्लिकेट (http://stackoverflow.com/questions/501906/caselessly-comparing-strings-in-c-sharp) – nawfal

+0

यदि कोई व्यक्ति इस प्रश्न पर ठोकर खाता है तो किसी शब्द के लिए केस असंवेदनशील तुलना की तलाश में, इस प्रश्न पर एक नज़र डालें यहां: [जेनेरिक शब्दकोश के लिए केस असंवेदनशील पहुंच] (http://stackoverflow.com/questions/13230414/case-insensitive-access-for-generic-dic tionary) – Robotnik

+0

यह वास्तव में अच्छा होगा; केस-असंवेदनशील संस्करण के रूप में समानांतर '~=' को समानांतर' ==' परिभाषित करने के लिए कहें। – eidylon

उत्तर

240

इस प्रयास करें:

string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase); 
+0

मैं एक रिश्तेदार स्टैक ओवरफ्लो नौसिखिया हूं - क्या आप एक लिंक जोड़कर क्या मतलब समझ सकते हैं? क्या आप एमएसडीएन दस्तावेज़ों का मतलब है? –

+0

gosh आप जल्दी हो .. lol मैं जवाब लिख रहा था कि आपको पहले मिला है = डी – Erick

+0

आप एक एमएसडीएन लिंक जोड़ सकते हैं (जो मैं आमतौर पर करता हूं) या यदि आपको कोई दिलचस्प ब्लॉग पोस्ट या ऐसा लगता है जो शायद उत्तर का विस्तार कर सकता है। – Samuel

14
System.Collections.CaseInsensitiveComparer 

या

System.StringComparer.OrdinalIgnoreCase 
+0

क्या यह पूरे एप्लिकेशन को प्रभावित करता है? – GateKiller

+0

नहीं, केवल तभी जब आप इसका इस्तेमाल करते हैं। – leppie

+2

मुझे इस पर और जानकारी कहां मिल सकती है। क्या इसका मतलब है कि मैं एक केस असंवेदनशील मैच के लिए == का उपयोग कर सकता हूं? – GateKiller

3

ऑपरेटर? नहीं, लेकिन मुझे लगता है कि आप अपनी संस्कृति बदल सकते हैं ताकि स्ट्रिंग तुलना केस-संवेदी न हो।

// you'll want to change this... 
System.Threading.Thread.CurrentThread.CurrentCulture 
// and you'll want to custimize this 
System.Globalization.CultureInfo.CompareInfo 

मुझे विश्वास है कि यह इस तरह से बदल जाएगा कि तारों की तुलना बराबर ऑपरेटर द्वारा की जा रही है।

+4

यह थोड़ा बदसूरत हैक imho है ... –

+0

हाँ, कम से कम कहने के लिए यह बिल्कुल नहीं है कि आप तब तक नहीं करना चाहते हैं जब तक कि आप सभी स्ट्रिंग तुलना को असंवेदनशील नहीं मानते। लेकिन मुझे लगता है कि यह बराबर ऑपरेटर के व्यवहार को बदलता है। –

9
string.Equals(StringA, StringB, StringComparison.CurrentCultureIgnoreCase); 
0
if (StringA.ToUpperInvariant() == StringB.ToUpperInvariant()) { 

लोग रिपोर्ट ToUpperInvariant() तेजी से ToLowerInvariant से() है।

+1

वर्तमान या वांछित संस्कृति के ऊपरी-आवरण के लिए विशेष नियम हैं, तो Invariant एक बुरा विचार हो सकता है। – OregonGhost

+0

और अर्थशास्त्र भी अलग हैं। – leppie

+0

क्या यह प्रत्येक स्ट्रिंग की एक नई प्रति बनाता है? यदि हां, तो बुरा विचार। – cjk

3

आप

if (stringA.equals(StringB, StringComparison.CurrentCultureIgnoreCase)) 
7

या

if (StringA.Equals(StringB, StringComparison.CurrentCultureIgnoreCase)) { 

उपयोग कर सकते हैं, लेकिन आप यह सुनिश्चित करें कि StringA रिक्त नहीं है की जरूरत है। तो शायद बेहतर tu उपयोग:

string.Equals(StringA , StringB, StringComparison.CurrentCultureIgnoreCase); 

जॉन के रूप में सुझाव दिया

संपादित करें: बग को सही

0
string.Compare(string1, string2, true) 
+1

इसमें आई 18 एन समस्याएं हो सकती हैं। –

16

StringComparer स्थिर वर्ग पर गुण है कि किसी भी प्रकार के comparers लौटने की एक संख्या हैं केस-सेंसिटीविटी जो आप चाहें:

StringComparer Properties

उदाहरण के लिए, आप कॉल कर सकते हैं

StringComparer.CurrentCultureIgnoreCase.Equals(string1, string2) 

या

StringComparer.CurrentCultureIgnoreCase.Compare(string1, string2) 

यह थोड़ा string.Equals या string.Compare भार के कि एक StringComparison तर्क ले तुलना में क्लीनर है।

2

मैं तो इन तुलना तरीकों के अंत में टाइपिंग के लिए इस्तेमाल किया कर रहा हूँ: , StringComparison.

तो मैं एक विस्तार कर दिया।

namespace System 
{ public static class StringExtension 
    { 
     public static bool Equals(this string thisString, string compareString, 
      StringComparison stringComparison) 
     { 
      return string.Equals(thisString, compareString, stringComparison); 
     } 
    } 
} 

बस ध्यान दें कि आप पहले ext बुला लिए thisString पर अशक्त के लिए जाँच करने की आवश्यकता होगी।

18

सबसे अच्छा तरीका है पत्र के मामले की अनदेखी 2 तार की तुलना करने के String.Equals स्थिर विधि को निर्दिष्ट एक क्रमसूचक उपेक्षा मामले स्ट्रिंग तुलना उपयोग करने के लिए है। यह तारों को कम या ऊपरी मामले में बदलने और उसके बाद तुलना करने से कहीं अधिक तेज़ तरीका है।

मैंने दोनों दृष्टिकोणों के प्रदर्शन का परीक्षण किया और सामान्य अनदेखा केस स्ट्रिंग तुलना 9 गुना तेज से अधिक थी! स्ट्रिंग्स को निम्न या ऊपरी मामले में परिवर्तित करने से भी अधिक विश्वसनीय है (तुर्की I समस्या देखें)। तो हमेशा समानता के लिए तार की तुलना करने के String.Equals विधि का उपयोग करें:

String.Equals(string1, string2, StringComparison.OrdinalIgnoreCase); 

आप एक विशिष्ट संस्कृति स्ट्रिंग तुलना आप निम्नलिखित कोड का उपयोग कर सकते प्रदर्शन करने के लिए करना चाहते हैं:

String.Equals(string1, string2, StringComparison.CurrentCultureIgnoreCase); 

कृपया ध्यान दें कि दूसरे उदाहरण का उपयोग करता है वर्तमान संस्कृति की स्ट्रिंग तुलना तर्क, जो इसे पहले उदाहरण में "सामान्य अनदेखा मामला" तुलना से धीमा कर देता है, इसलिए यदि आपको किसी भी संस्कृति विशिष्ट स्ट्रिंग तुलना तर्क की आवश्यकता नहीं है और आप अधिकतम प्रदर्शन के बाद हैं, तो " सामान्य अनदेखा मामला "तुलना।

अधिक जानकारी के लिए, read the full story on my blog

+0

'ToLower' या' ToLowerInvariant' का सुझाव न दें: वे तुलना करने के लिए स्मृति बनाते हैं, और वे असफल हो सकते हैं क्योंकि नए वर्ण सेट यूनिकोड में जोड़े जाते हैं। 'ToUpper' तुर्की 'i' के कारण दूसरों के बीच विफल रहता है; इसी कारण से भविष्य में 'ToLower' विफल नहीं होगा इसका कोई कारण नहीं है। – antiduh

+0

@antiduh, आपकी टिप्पणी के लिए धन्यवाद। हम में से अधिकांश इन संभावित समस्याओं से अवगत हैं, इंटरनेट पर कई ट्यूटोरियल तुर्की 'मैं' उदाहरण के रूप में देते हैं। जैसा कि आप मेरी पोस्ट में देखते हैं, मैं 'ToLower' या' ToLowerInvariant' विधियों का उपयोग करने की अनुशंसा नहीं करता हूं, मैं बस यह दिखाना चाहता था कि 'स्ट्रिंग। एक्वाल्स' विधि कितनी अधिक कुशल है। –

+3

"हम में से अधिकांश इन संभावित समस्याओं से अवगत हैं, इंटरनेट पर कई ट्यूटोरियल तुर्की 'मैं' उदाहरण के रूप में देते हैं" - पर्याप्त लोग नहीं हैं, और आप अभी भी इसे अपने उत्तर में दूसरी वाक्य के रूप में उल्लेख कर रहे हैं। इसके अलावा, आपके * उत्तर * में इसका उपयोग करने के लिए पर्याप्त औचित्य शामिल नहीं है - आप बस प्रदर्शन का उल्लेख करते हैं; प्रदर्शन हमेशा परम प्राथमिकता नहीं है। नतीजतन, आप वर्तमान में सहायता केंद्र दिशानिर्देशों का उल्लंघन कर रहे हैं; बाहरी साइटों के लिंक ठीक हैं, लेकिन आपने सामग्री को पर्याप्त रूप से सारांशित नहीं किया है (तुर्की 'मैं' समस्या)। तो आपका विज्ञापन मंच नहीं है। – antiduh

0

अन्य उत्तर यहां पूरी तरह मान्य हैं, लेकिन किसी भी तरह StringComparison.OrdinalIgnoreCase टाइप करने और String.Compare का उपयोग करने में कुछ समय लगता है।

मैं साधारण स्ट्रिंग विस्तार विधि है, जहां आप अगर तुलना केस संवेदी या मामले बूलियन साथ बेहोश है निर्दिष्ट कर सकते हैं कोड जोड़ने के बाद - निम्नलिखित जवाब देखें:

https://stackoverflow.com/a/49208128/2338477

संबंधित मुद्दे