আপনারা যেমন সচেতন বলে মনে করছেন, দুটি স্ট্রিংকে ছোট করে তুলনা করা একটি উপেক্ষা-কেস তুলনা করার মতো নয়। এর অনেক কারণ রয়েছে। উদাহরণস্বরূপ, ইউনিকোড স্ট্যান্ডার্ড ডায়াক্রিটিক্স সহ পাঠ্যকে একাধিক উপায়ে এনকোড করার অনুমতি দেয়। কিছু অক্ষর একক কোড পয়েন্টে বেস চরিত্র এবং ডায়াক্রিটিক উভয়ই অন্তর্ভুক্ত করে। এই অক্ষরগুলি একটি বেসিক চরিত্র হিসাবে সম্মিলিত ডায়ারিকটিক অক্ষর দ্বারা প্রতিনিধিত্ব করা যেতে পারে। এই দুটি উপস্থাপনা সকল উদ্দেশ্যে সমান, এবং .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();
}
অবশ্যই, আপনি সম্ভবত কিছু স্ট্যান্ডার্ড প্যারামিটার এবং কাস্টমসুইচডেস্টিনেশন প্রতিনিধিটিতে একটি রিটার্ন টাইপ যুক্ত করতে চান। এবং আপনি আরও ভাল নাম করতে চাইবেন!
যদি আপনার প্রতিটি মামলার আচরণ এই পদ্ধতিতে অনুরোধ জানাতে উপযুক্ত না হয় যেমন ডিফারেন্ট প্যারামিটারগুলি প্রয়োজনীয় হয় তবে আপনি শৃঙ্খলাবদ্ধ 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()
? এছাড়াও, তিনি দুটি অজানা স্ট্রিংয়ের তুলনা করছেন না , তিনি একটি অজানা স্ট্রিংকে একটি পরিচিত স্ট্রিংয়ের সাথে তুলনা করছেন। সুতরাং, যতক্ষণ না তিনি উপযুক্ত ওপরের বা লোয়ার কেস উপস্থাপনের জন্য হার্ডকোড করতে জানেন ততক্ষণ স্যুইচ ব্লকের কাজ করা উচিত work