ตามที่คุณทราบแล้วการลดขนาดสองสตริงและการเปรียบเทียบไม่เหมือนกับการเปรียบเทียบตัวพิมพ์เล็กและใหญ่ มีเหตุผลมากมายสำหรับเรื่องนี้ ตัวอย่างเช่นมาตรฐาน Unicode อนุญาตให้เข้ารหัสข้อความที่มีเครื่องหมายกำกับเสียงได้หลายวิธี อักขระบางตัวมีทั้งอักขระพื้นฐานและตัวกำกับเสียงในจุดรหัสเดียว อักขระเหล่านี้อาจแสดงเป็นอักขระพื้นฐานตามด้วยอักขระกำกับเสียง การแสดงทั้งสองนี้มีค่าเท่ากันสำหรับวัตถุประสงค์ทั้งหมดและการเปรียบเทียบสตริงที่รับรู้วัฒนธรรมใน. NET Framework จะระบุได้อย่างถูกต้องว่าเท่าเทียมกันโดยใช้ CurrentCulture หรือ InvariantCulture (มีหรือไม่มี IgnoreCase) ในทางกลับกันการเปรียบเทียบลำดับจะถือว่าไม่เท่ากันอย่างไม่ถูกต้อง
น่าเสียดายที่switch
ไม่ได้ทำอะไรเลยนอกจากการเปรียบเทียบลำดับ การเปรียบเทียบลำดับนั้นใช้ได้ดีสำหรับแอปพลิเคชันบางประเภทเช่นการแยกวิเคราะห์ไฟล์ ASCII ที่มีรหัสที่กำหนดไว้อย่างเข้มงวด แต่การเปรียบเทียบสตริงลำดับจะผิดสำหรับการใช้งานอื่น ๆ ส่วนใหญ่
สิ่งที่ฉันได้ทำในอดีตเพื่อให้ได้พฤติกรรมที่ถูกต้องเป็นเพียงการล้อเลียนคำสั่งสวิตช์ของฉันเอง มีหลายวิธีในการทำเช่นนี้ วิธีหนึ่งคือการสร้างList<T>
สตริงเคสและผู้รับมอบสิทธิ์คู่หนึ่ง สามารถค้นหารายการได้โดยใช้การเปรียบเทียบสตริงที่เหมาะสม เมื่อพบการจับคู่แล้วอาจมีการเรียกตัวแทนที่เกี่ยวข้อง
อีกทางเลือกหนึ่งคือการสร้างห่วงโซ่ของif
ข้อความที่ชัดเจน สิ่งนี้มักจะไม่เลวร้ายอย่างที่คิดเนื่องจากโครงสร้างเป็นปกติมาก
สิ่งที่ยอดเยี่ยมเกี่ยวกับเรื่องนี้คือไม่มีบทลงโทษด้านประสิทธิภาพในการจำลองฟังก์ชันสวิตช์ของคุณเองเมื่อเปรียบเทียบกับสตริง ระบบจะไม่สร้างตารางกระโดด O (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 และคุณจะต้องสร้างชื่อให้ดีขึ้น!
หากลักษณะการทำงานของแต่ละกรณีของคุณไม่คล้อยตามการมอบหมายการภาวนาในลักษณะนี้เช่นถ้าพารามิเตอร์ differnt มีความจำเป็นแล้วคุณจะติดอยู่กับล่ามโซ่if
statments ฉันเคยทำแบบนี้มาแล้วหลายครั้ง
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()
? นอกจากนี้เขาไม่ได้เปรียบเทียบสตริงที่ไม่รู้จักสองสตริงเขากำลังเปรียบเทียบสตริงที่ไม่รู้จักหนึ่งสตริงกับสตริงที่รู้จักกัน ดังนั้นตราบใดที่เขารู้วิธีฮาร์ดโค้ดการแทนตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กที่เหมาะสมบล็อกสวิตช์ก็ควรทำงานได้ดี