2010-09-12 18 views
9

अगर मैं कुछ इस तरह करते हैं ...सी #: toupper के बारे में भ्रम की स्थिति() और ToLower()

String myVar = "in"; 
if(myVar.ToUpper() == "in") 
{ 
    //do something 
} 

यह "अगर" ब्लॉक ..right अंदर जाने के लिए नहीं जा रहा है?

या

यह दोनों "में" और "" और कर के लिए जाँच करने के लिए जो कुछ भी अंदर है तो जा रहा है? यदि हां, तो वह क्यों है? क्या यह "अगर" ब्लॉक के अंदर क्या है उसे छोड़ना नहीं है?

एक ही भ्रम की स्थिति है के बारे में ToLower() भी

संपादित:

if((myVar.ToUpper().Equals("in"))&&(myVar.Equals("in"))) 

this..right की तरह: तो दोनों ही मामलों की जांच के लिए, मैं लिखने के लिए की आवश्यकता है? तो यह है, तो ब्लॉक निष्पादित नहीं करता है -

+1

जॉन की सलाह ठोस है, लेकिन मैं समझाना चाहता हूं कि ऊपर क्या गलत हुआ। यदि आप इसे "इन" के रूप में जांचना चाहते हैं और मामले की परवाह नहीं करते हैं, तो आप या तो 'ToLower' कर सकते हैं और "इन" या' ToUpper' की तुलना कर सकते हैं और 'IN' की तुलना कर सकते हैं। आपको कई तुलनाओं की आवश्यकता नहीं है। किसी भी मामले में, मैं सलाह देता हूं कि जॉन ने क्या सलाह दी। –

उत्तर

43

ऊपरी मामले में परिवर्तित करने और फिर तुलना करने की बजाय, आपको समानता तुलना का उपयोग करना चाहिए जिसे केस-असंवेदनशील बनाया जा सकता है। उदाहरण के लिए:

if (myVar.Equals("in", StringComparison.OrdinalIgnoreCase)) 
{ 
    ... 
} 

आप ध्यान से वास्तव में विचार करना चाहिए जो नियम हैं उचित - क्रमसूचक, वर्तमान संस्कृति, अपरिवर्तनीय संस्कृति, या संभवतः एक और संस्कृति पूरी तरह से (जैसे StringComparer.Create(culture, true) का उपयोग)।

इसके आसपास अधिक जानकारी के लिए, एमएसडीएन Best Practices for Using Strings in the .NET Framework आलेख पढ़ें।

+0

+1 किया जा रहा है (अभी तक) केवल उत्तर के लिए कि निचले मामले और ऊपरी मामले के अलावा "संस्कृति" का उल्लेख है। – stakx

+0

यदि बयानों के लिए मैं पूरी तरह से आपसे सहमत हूं लेकिन तारों के स्विच स्टेटमेंट के बारे में क्या है? मैंने कहीं पढ़ा है कि स्ट्रिंग को ऊपरी केस में बदलने के लिए सबसे अच्छा है उदा। स्विच (myVar.ToUpper()) {केस "MYCASE1": ...} –

+0

@ mjf196: यह संदर्भ पर निर्भर करता है - यहां ऊपरी-कैसा चल रहा है? यदि यह उपयोगकर्ता इनपुट है, तो आपको वास्तव में यह सोचने की ज़रूरत है कि आप वास्तव में क्या व्यवहार करना चाहते हैं। –

2

"में" "में" के बराबर नहीं है। ToLower() के मामले में यदि यह ब्लॉक "इन" के बराबर "इन" के रूप में निष्पादित करेगा ..

5

अभिव्यक्ति something.ToUpper().Equals("lowercaseletters") कभी भी सत्य नहीं होगी, इसलिए आपके उदाहरण में if-block निष्पादित नहीं किया जाएगा। और निश्चित रूप से, यह ToLower पर भी लागू होता है; something.ToLower().Equals("UPPERCASE") कभी भी सच नहीं होगा, या तो।

2

पहले अगर आप की तुलना करने के तार का उपयोग .Equals चाहते()

myVar.toUpper().Equals("in") 

दूसरा पहले के अंदर अगर निष्पादित किया जाता है, के बाद ही कि वापसी परीक्षण किया जाता है सभी कोड।

तो

String myVar="in"; 
if(myVar.toUpper().Equals("in")) 
{ 
    //do something 
} 

नहीं "कुछ करना" है।

+1

ठीक है, मैं काट दूंगा: 'बराबर 'का उपयोग क्यों करें? –

+0

स्टीवन: फ़ैम्पिनहेरो जावा में स्पष्ट रूप से लिख रहा है, जहां 'बराबर' की आवश्यकता है क्योंकि स्ट्रिंग के लिए '==' ओवरलोड नहीं किया गया है। – Gabe

+0

कुछ भाषाओं में "==" ऑपरेटर दो ऑब्जेक्ट संदर्भों की तुलना करता है यह देखने के लिए कि वे एक ही उदाहरण को संदर्भित करते हैं या नहीं। मुझे विश्वास नहीं है कि यह सी # में मामला है; ऑपरेटर स्ट्रिंग :: हुड के नीचे बराबर कॉल करता है। यह अभी भी बाइट-दर-बाइट मूल्यों हालांकि तुलना है, तो आप वास्तव में शायद .Compare() चाहते – RJFalconer

2

आप कुछ करते हैं जैसे आप ने कहा, यह अगर ब्लॉक में जाने नहीं करेगा, और यहाँ क्यों है:

ऑपरेटर्स बाईं तरफ वस्तु पर लागू होते हैं। तो अपने कोड लेखन इस रूप में ही है:

String myVar="in"; 
String testVar = myVar.ToUpper(); 
if(testVar=="in") //This will never be true 
{ 
    //do something 
} 

अपने संपादित, आप अभी भी परीक्षण नहीं कर रहे हैं, तो अपने स्ट्रिंग == "में", आप 2 परीक्षण कर रहे हैं अपने स्ट्रिंग है देखने के लिए है == "में"।

आप इस के लिए अपने मूल यह काम करेगा क्या परिवर्तित हुआ है:

String myVar="in"; 
if(myVar.ToUpper()=="IN") 
{ 
    //do something 
} 

आपका संपादन दोनों ही मामलों का परीक्षण करने के लिए इस तरह होना चाहिए:

if((myVar.ToUpper().Equals("IN"))&&(myVar.Equals("in"))) 

संपादित करें: से स्टीवन की टिप्पणी कुछ और स्पष्टीकरण:

if((myVar.ToUpper().Equals("IN"))&&(myVar.Equals("in"))) 

वह कोड नमूना 2 तुलना करता है, लेकिन यदि मेरा वीर कभी मिश्रित केस संस्करण होगा में (आईई: इन आईएन इन में) तो दूसरी तुलना आवश्यक नहीं है। एक बार जब मैंने स्ट्रिंग को ToUpper() में परिवर्तित कर दिया है, तो आपको केवल यह जांचना होगा कि यह IN के बराबर है या नहीं।

if(myVar.ToUpper().Equals("IN")) 

या

if(myVar.ToUpper() == "IN") 

मैं व्यक्तिगत रूप से == नहीं .Equals विधि का प्रयोग करेंगे: तो मैं के साथ कि लाइन की जगह लेंगे।

+0

मुझे दोनों परीक्षण करने का बिंदु नहीं दिख रहा है। यदि दूसरा सच है, तो पहला भी होगा। इसी तरह, मुझे नहीं पता कि आप 'समान' का उपयोग क्यों कर रहे हैं। क्या आप? –

+0

@ स्टेवन मैं इसका उपयोग कर रहा हूं क्योंकि ओपी ने अपने प्रश्नों में इसका उपयोग किया था। दूसरी स्थिति में, आप सही हैं। बस इसका उपयोग करके ओपी का उपयोग किया जाता है। – thorkia

+0

अच्छा, यह समझाता है, लेकिन मैं आपको आश्वासन देता हूं कि हमारे उत्तर प्रश्नों से किसी भी त्रुटि को दोहराने के लिए बाध्य नहीं हैं। :-) –

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