ما هو الأفضل بشكل عام للاستخدام - StringComparison.OrdinalIgnoreCase أو StringComparison.InvariantCultureIgnoreCase؟

StackOverflow https://stackoverflow.com/questions/72696

  •  09-06-2019
  •  | 
  •  

سؤال

لدي بعض التعليمات البرمجية مثل هذا:

If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
    DoSomething()
End If

أنا لا أهتم بالقضية.هل ينبغي أن أستخدم OrdinalIgnoreCase, InvariantCultureIgnoreCase, ، أو CurrentCultureIgnoreCase?

هل كانت مفيدة؟

المحلول

يحتوي برنامج .Net Docs الأحدث الآن على جدول لمساعدتك في تحديد الخيار الأفضل للاستخدام في موقفك.

من MSDN "توصيات جديدة لاستخدام السلاسل في Microsoft .NET 2.0"

ملخص:أصحاب الكود كانوا يستخدمون سابقًا InvariantCulture لمقارنة السلسلة والغلاف والفرز يجب أن تفكر بشدة في استخدام مجموعة جديدة من String التحميل الزائد في Microsoft .NET 2.0. على وجه التحديد، البيانات التي تم تصميمها لتكون حيادية ثقافيًا وغير ذات صلة لغويًا يجب أن يبدأ في تحديد الأحمال الزائدة باستخدام إما StringComparison.Ordinal أو StringComparison.OrdinalIgnoreCase أعضاء جدد StringComparison تعداد.هذه تفرض مقارنة بايت بايت مشابهة لـ strcmp وهذا لا يتجنب الأخطاء الناتجة عن التفسير اللغوي للسلاسل الرمزية بشكل أساسي فحسب، بل يوفر أداءً أفضل.

نصائح أخرى

كل هذا يتوقف

من الصعب مقارنة سلاسل Unicode:

يجب أن يأخذ تنفيذ عمليات البحث عن سلسلة Unicode والمقارنات في برنامج معالجة النص في الاعتبار وجود نقاط رمز مكافئة.في حالة عدم وجود هذه الميزة ، لن يتمكن المستخدمون الذين يبحثون عن تسلسل نقطة رمز معين من العثور على حربية أخرى لا يمكن تمييزها بصريًا والتي لها تمثيل مختلف ، ولكن مكافئًا من الناحية القانونية.

يرى: http://en.wikipedia.org/wiki/Unicode_equvalence


إذا كنت تحاول مقارنة سلسلتين Unicode بطريقة غير حساسة لحالة الأحرف وتريد أن تعمل في كل مكان, ، لديك مشكلة مستحيلة.

المثال الكلاسيكي هو تركي ط, ، والتي عندما تصبح كبيرة الحجم تصبح İ (لاحظ النقطة)

بشكل افتراضي، يستخدم إطار عمل .Net عادةً الامتداد الثقافة الحالية للوظائف المرتبطة بالسلسلة، مع استثناء مهم جدًا وهو .Equals يستخدم مقارنة ترتيبية (بايت بايت).

وهذا يؤدي، حسب التصميم، إلى أن وظائف السلسلة المختلفة تتصرف بشكل مختلف اعتمادًا على ثقافة الكمبيوتر.


ومع ذلك، في بعض الأحيان نريد مقارنة "للغرض العام"، غير حساسة لحالة الأحرف.

على سبيل المثال، قد ترغب في أن تتصرف مقارنة السلسلة بنفس الطريقة، بغض النظر عن جهاز الكمبيوتر الذي تم تثبيت التطبيق الخاص بك عليه.

لتحقيق ذلك لدينا 3 خيارات:

  1. قم بتعيين الثقافة بشكل صريح وقم بإجراء مقارنة غير حساسة لحالة الأحرف باستخدام قواعد تكافؤ Unicode.
  2. قم بتعيين الثقافة على الثقافة الثابتة وقم بإجراء مقارنة غير حساسة لحالة الأحرف باستخدام قواعد تكافؤ Unicode.
  3. يستخدم OrdinalIgnoreCase والتي ستكتب الأحرف الكبيرة في السلسلة باستخدام InvariantCulture ثم تقوم بإجراء مقارنة بايت بالبايت.

قواعد تكافؤ Unicode معقدة، مما يعني أن استخدام الطريقة 1) أو 2) أكثر تكلفة من OrdinalIgnoreCase.حقيقة ان OrdinalIgnoreCase لا يقوم بأي تسوية خاصة لليونيكود، مما يعني أن بعض السلاسل يتم عرضها بنفس الطريقة على شاشة الكمبيوتر، سوف لن تعتبر متطابقة.على سبيل المثال: "\u0061\u030a" و "\u00e5" كلاهما يقدم å.ولكن في المقارنة الترتيبية سيتم اعتبارها مختلفة.

يعتمد اختيارك بشكل كبير على التطبيق الذي تقوم بإنشائه.

  • إذا كنت أكتب تطبيقًا لخط أعمال يستخدمه المستخدمون الأتراك فقط، فسأتأكد من استخدام الطريقة الأولى.
  • إذا كنت بحاجة فقط إلى مقارنة بسيطة "وهمية" غير حساسة لحالة الأحرف، على سبيل المثال اسم عمود في قاعدة البيانات، والذي عادةً ما يكون باللغة الإنجليزية، فمن المحتمل أن أستخدم الطريقة الثالثة.

مايكروسوفت لديها مجموعة من التوصيات مع مبادئ توجيهية واضحة.ومع ذلك، من المهم حقًا فهم فكرة تكافؤ Unicode قبل تناول هذه المشكلات.

يرجى أيضًا أن تضع في اعتبارك أن OrdinalIgnoreCase هو ملف نوع خاص جدا الوحش، وهو انتقاء واختيار القليل من الترتيب مقارنة مع بعض الجوانب المعجمية المختلطة.هذا يمكن أن يكون مربكا.

تقدم MSDN بعض التوصيات الواضحة حول هذا الأمر: http://msdn.microsoft.com/en-us/library/ms973919.aspx

أعتقد أن ذلك يعتمد على حالتك.نظرًا لأن المقارنات الترتيبية تبحث فعليًا في قيم Unicode الرقمية للأحرف، فلن تكون الخيار الأفضل عند الفرز أبجديًا.بالنسبة لمقارنات السلسلة، سيكون الترتيب الترتيبي أسرع قليلاً.

يعتمد الأمر على ما تريد، على الرغم من أنني سأخجل من الثقافة الثابتة إلا إذا كنت كذلك جداً من المؤكد أنك لن ترغب أبدًا في ترجمة الكود للغات أخرى.استخدم CurrentCulture بدلاً من ذلك.

أيضًا، يجب أن يحترم OrdinalIgnoreCase الأرقام، التي قد تكون أو لا تكون ما تريده.

الإجابة البسيطة هي أنه ما لم تكن تستخدم اللغة التركية، فلن تحتاج إلى استخدام InvariantCulture.

انظر الرابط التالي:

في C# ما الفرق بين ToUpper() و ToUpperInvariant()؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top