ฉันมีรหัสเช่นนี้:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
ฉันไม่สนใจเรื่องนี้ ฉันควรใช้OrdinalIgnoreCase
, InvariantCultureIgnoreCase
หรือCurrentCultureIgnoreCase
?
ฉันมีรหัสเช่นนี้:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
ฉันไม่สนใจเรื่องนี้ ฉันควรใช้OrdinalIgnoreCase
, InvariantCultureIgnoreCase
หรือCurrentCultureIgnoreCase
?
คำตอบ:
เอกสาร. Net รุ่นใหม่กว่านี้มีตารางที่จะช่วยคุณตัดสินใจว่าจะใช้สิ่งใดดีที่สุดในสถานการณ์ของคุณ
จาก " คำแนะนำใหม่สำหรับการใช้สตริงใน Microsoft .NET 2.0 " ของ MSDN
สรุป: ก่อนหน้านี้เจ้าของรหัสที่ใช้
InvariantCulture
สำหรับการเปรียบเทียบสตริงการจัดเรียงและการเรียงลำดับควรพิจารณาอย่างยิ่งว่าจะใช้ชุดString
โอเวอร์โหลดใหม่ใน Microsoft .NET 2.0 โดยเฉพาะอย่างยิ่งข้อมูลที่ออกแบบมาเพื่อไม่เชื่อเรื่องวัฒนธรรมและไม่เกี่ยวข้องกับภาษาควรเริ่มระบุ overloads โดยใช้ทั้งStringComparison.Ordinal
หรือStringComparison.OrdinalIgnoreCase
สมาชิกของการStringComparison
แจงนับใหม่ สิ่งเหล่านี้บังคับใช้การเปรียบเทียบแบบไบต์ต่อไบต์คล้ายกับstrcmp
ที่ไม่เพียง แต่หลีกเลี่ยงข้อบกพร่องจากการตีความภาษาของสตริงสัญลักษณ์เป็นหลัก แต่ให้ประสิทธิภาพที่ดีขึ้น
"Straße"
"STRASSE"
เมื่อใช้ผลตอบแทนในขณะที่กล่าวว่าพวกเขากำลังเท่ากัน OrdinalIgnoreCase
Equals
false
InvariantCultureIgnoreCase
การเปรียบเทียบสตริง unicode นั้นยาก:
การใช้การค้นหาและเปรียบเทียบสตริง Unicode ในซอฟต์แวร์ประมวลผลข้อความจะต้องคำนึงถึงการมีจุดรหัสเทียบเท่า ในกรณีที่ไม่มีคุณสมบัตินี้ผู้ใช้ที่ค้นหาลำดับจุดรหัสเฉพาะจะไม่สามารถค้นหาร่ายมนตร์ที่มองไม่เห็นอื่น ๆ ที่มีการแทนค่าจุดรหัสที่แตกต่าง
ดู: http://en.wikipedia.org/wiki/Unicode_equivalence
หากคุณพยายามเปรียบเทียบ 2 ยูนิโค้ดสตริงในกรณีที่ไม่รู้สึกตัวและต้องการให้มันทำงานได้ทุกที่คุณมีปัญหาที่เป็นไปไม่ได้
ตัวอย่างคลาสสิกคือภาษาตุรกี iซึ่งเมื่อตัวพิมพ์ใหญ่กลายเป็นİ (สังเกตเห็นจุด)
โดยค่าเริ่มต้นกรอบงาน. Net มักจะใช้CurrentCultureสำหรับฟังก์ชั่นที่เกี่ยวข้องกับสตริงโดยมีข้อยกเว้นที่สำคัญมาก.Equals
ซึ่งใช้การเปรียบเทียบลำดับ (ไบต์ต่อไบต์)
สิ่งนี้นำไปสู่โดยการออกแบบไปยังฟังก์ชั่นสตริงต่างๆที่ทำงานแตกต่างกันไปตามวัฒนธรรมของคอมพิวเตอร์
อย่างไรก็ตามบางครั้งเราต้องการ "จุดประสงค์ทั่วไป", การพิจารณาเล็ก ๆ น้อย ๆ , การเปรียบเทียบ
ตัวอย่างเช่นคุณอาจต้องการให้การเปรียบเทียบสตริงของคุณทำงานในลักษณะเดียวกันไม่ว่าคอมพิวเตอร์ของคุณจะติดตั้งแอปพลิเคชันใด
เพื่อให้บรรลุสิ่งนี้เรามี 3 ตัวเลือก:
Unicode กฎความเท่าเทียมมีความซับซ้อนซึ่งหมายถึงการใช้วิธีที่ 1) หรือ 2) OrdinalIgnoreCase
มีราคาแพงกว่า ความจริงที่OrdinalIgnoreCase
ไม่ได้ทำการปรับให้เป็นยูนิโค้ดพิเศษหมายความว่าสตริงบางตัวที่แสดงในลักษณะเดียวกันบนหน้าจอคอมพิวเตอร์จะไม่ถูกพิจารณาว่าเหมือนกัน ตัวอย่างเช่น: "\u0061\u030a"
และ"\u00e5"
ทั้งสองแสดงผลå อย่างไรก็ตามในการเปรียบเทียบลำดับจะถือว่าแตกต่างกัน
สิ่งที่คุณเลือกอย่างหนักนั้นขึ้นอยู่กับแอปพลิเคชันที่คุณกำลังสร้าง
Microsoft มีชุดคำแนะนำพร้อมแนวทางที่ชัดเจน อย่างไรก็ตามมันเป็นสิ่งสำคัญที่จะเข้าใจความคิดของการเทียบเท่ายูนิโค้ดก่อนที่จะเข้าใกล้ปัญหาเหล่านี้
นอกจากนี้โปรดจำไว้ว่า OrdinalIgnoreCase เป็นสัตว์ชนิดพิเศษที่เลือกและเลือกลำดับบิตเปรียบเทียบกับบางอย่างที่ผสมในแง่ของพจนานุกรม สิ่งนี้อาจทำให้สับสน
ฉันเดาว่ามันขึ้นอยู่กับสถานการณ์ของคุณ เนื่องจากการเปรียบเทียบตามลำดับจริง ๆ แล้วดูที่ค่าตัวเลข Unicode ของตัวละครพวกเขาจะไม่เป็นตัวเลือกที่ดีที่สุดเมื่อคุณเรียงลำดับตัวอักษร สำหรับการเปรียบเทียบสตริงแม้ว่าอันดับจะเร็วกว่าเล็กน้อย
มันขึ้นอยู่กับสิ่งที่คุณต้องการ แต่ฉันอายห่างจาก InvariantCulture ถ้าคุณมากแน่ใจว่าคุณจะไม่ต้องการที่จะ จำกัด รหัสสำหรับภาษาอื่น ๆ ใช้ CurrentCulture แทน
นอกจากนี้ OrdinalIgnoreCase ควรเคารพตัวเลขซึ่งอาจเป็นหรือไม่ใช่สิ่งที่คุณต้องการ
คำตอบที่ง่ายมากคือถ้าคุณไม่ใช้ภาษาตุรกีคุณไม่จำเป็นต้องใช้ InvariantCulture
ดูลิงค์ต่อไปนี้:
ใน C # อะไรคือความแตกต่างระหว่าง ToUpper () และ ToUpperInvariant ()