जैसा कि आप जानते हैं, दो स्ट्रिंग्स को कम करना और उनकी तुलना करना इग्नोर-केस की तुलना करने जैसा नहीं है। इसके कई कारण हैं। उदाहरण के लिए, यूनिकोड मानक पाठविज्ञान को कई तरीकों से कूटबद्ध करने की अनुमति देता है। कुछ वर्णों में आधार चरित्र और एकल कोड बिंदु में विशेषक दोनों शामिल हैं। इन वर्णों का प्रतिनिधित्व आधार वर्ण के रूप में भी किया जा सकता है, जिसके बाद एक संयोजन वर्णक वर्ण भी होता है। ये दो अभ्यावेदन सभी उद्देश्यों के लिए समान हैं, और .NET फ्रेमवर्क में कल्चर-अवेलेबल स्ट्रिंग कंपेरिजन या इनटैरिकल्चर (इग्नोरकैस के साथ या बिना) के साथ, समान रूप से उनकी सही पहचान करेंगे। दूसरी ओर, एक क्रमिक तुलना, उन्हें गलत रूप से असमान मान लेगी।
दुर्भाग्य से, switchकुछ भी नहीं करता है , लेकिन एक क्रमिक तुलना। कुछ प्रकार के अनुप्रयोगों के लिए एक क्रमिक तुलना ठीक है, जैसे कठोर परिभाषित कोड वाली ASCII फ़ाइल को पार्स करना, लेकिन अधिकांश अन्य उपयोगों के लिए क्रमिक स्ट्रिंग तुलना गलत है।
मैंने सही व्यवहार प्राप्त करने के लिए अतीत में जो किया है वह मेरे स्वयं के स्विच स्टेटमेंट का मजाक उड़ा रहा है। ऐसा करने के बहुत सारे तरीके हैं। एक तरीका List<T>केस स्ट्रिंग्स और डेलिगेट्स के जोड़े बनाने का होगा । सूची को उचित स्ट्रिंग तुलना का उपयोग करके खोजा जा सकता है। जब मैच मिल जाता है तो संबंधित प्रतिनिधि को आमंत्रित किया जा सकता है।
एक अन्य विकल्प ifबयानों की स्पष्ट श्रृंखला करना है । यह आमतौर पर उतना बुरा नहीं होता जितना लगता है, क्योंकि संरचना बहुत नियमित है।
इसके बारे में महान बात यह है कि स्ट्रिंग्स के खिलाफ तुलना करने पर अपनी स्वयं की स्विच कार्यक्षमता को मॉक करने में वास्तव में कोई प्रदर्शन जुर्माना नहीं है। सिस्टम एक पूर्णांक के साथ ओ (1) जंप टेबल बनाने के लिए नहीं जा रहा है, इसलिए यह किसी भी समय एक स्ट्रिंग की तुलना करने जा रहा है।
यदि कई मामलों की तुलना की जानी है, और प्रदर्शन एक मुद्दा है, तो List<T>ऊपर वर्णित विकल्प को एक हल शब्दकोश या हैश तालिका से बदला जा सकता है। फिर प्रदर्शन संभावित रूप से स्विच स्टेटमेंट विकल्प से मेल खा सकता है या अधिक हो सकता है।
यहाँ प्रतिनिधियों की सूची का एक उदाहरण है:
delegate void CustomSwitchDestination();
List<KeyValuePair<string, CustomSwitchDestination>> customSwitchList;
CustomSwitchDestination defaultSwitchDestination = new CustomSwitchDestination(NoMatchFound);
void CustomSwitch(string value)
{
foreach (var switchOption in customSwitchList)
if (switchOption.Key.Equals(value, StringComparison.InvariantCultureIgnoreCase))
{
switchOption.Value.Invoke();
return;
}
defaultSwitchDestination.Invoke();
}
बेशक, आप शायद कुछ मानक मापदंडों को जोड़ना चाहेंगे और संभवत: CustomSwitchDestination प्रतिनिधि को एक वापसी प्रकार। और आप बेहतर नाम बनाना चाहते हैं!
यदि आपके प्रत्येक मामले का व्यवहार इस तरह से मंगलाचरण को सौंपने के लिए उत्तरदायी नहीं है, जैसे कि यदि अलग-अलग पैरामीटर आवश्यक हैं, तो आप जंजीरों से बंधे हुए हैं if। मैंने भी कुछ बार ऐसा किया है।
if (s.Equals("house", StringComparison.InvariantCultureIgnoreCase))
{
s = "window";
}
else if (s.Equals("business", StringComparison.InvariantCultureIgnoreCase))
{
s = "really big window";
}
else if (s.Equals("school", StringComparison.InvariantCultureIgnoreCase))
{
s = "broken window";
}
ToUpperInvariant()याToLowerInvariant()? इसके अलावा, वह दो अज्ञात तारों की तुलना नहीं कर रहा है , वह एक अज्ञात स्ट्रिंग की एक ज्ञात स्ट्रिंग से तुलना कर रहा है। इस प्रकार, जब तक वह जानता है कि उपयुक्त ऊपरी या निचले मामले के प्रतिनिधित्व को हार्डकोड कैसे किया जाए तो स्विच ब्लॉक को ठीक काम करना चाहिए।