تنفيذ عمليات السلاسل الغير متحسسة للثقافة في مجموعات
يوجد فئات وأعضاء في مساحة الاسم System.Collections توفر سلوك متحسس للثقافة افتراضياً. المُنشئات الافتراضية للفئات CaseInsensitiveComparer و CaseInsensitiveHashCodeProvider تقوم بتهيئة مثيل جديد باستخدام خاصية Thread.CurrentCulture . تقوم جميع التحميلات الزائدة لأسلوب CollectionsUtil.CreateCaseInsensitiveHashTable بإنشاء مثيل جديد من الفئة Hashtable باستخدام الخاصية Thread.CurrentCulture افتراضياً. تقوم التحميلات الزائدة لأسلوب: ArrayList.Sort بتنفيذ تصنيفات متحسسة للثقافة افتراضياً باستخدام Thread.CurrentCulture. الفرز و البحث في SortedList يمكن أن تتأثر بـ Thread.CurrentCulture عندما تستخدم السلاسل كمفاتيح. اتبع نصائح الاستخدام المتوفرة في هذا المقطع للحصول على نتائج غير متحسسة للثقافة من هذه الفئات و الأساليب في مساحة الاسم Collections .
ملاحظة: تمرير CultureInfo.InvariantCulture إلى أسلوب مقارنة تقوم فعلاً بتنفيذ مقارنة غير متحسسة للثقافة. ومع ذلك، فإنه لا يؤدي إلى مقارنة غير لغوية، على سبيل المثال، لمسارات الملفات، مفاتيح التسجيل، و متغيرات البيئة. و لا يدعم قرارات الأمان استناداً إلى نتائج المقارنة. للمقارنة غير اللغوية أو دعم قرارات الأمان المستندة إلى النتيجة، يجب على التطبيق استخدام أسلوب مقارنة يقبل القيمة StringComparison . بعد ذلك يجب أن يمرر التطبيق Ordinal.
باستخدام الفئات: CaseInsensitiveComparer و CaseInsensitiveHashCodeProvider
تقوم المُنشئات الافتراضية لـ CaseInsensitiveHashCodeProvider و CaseInsensitiveComparer بتهيئة مثيل جديد من الفئة باستخدام Thread.CurrentCulture ، الذي ينتج سلوك متحسس للثقافة. يوضح مثال التعليمات البرمجية التالي المُنشئ لـ Hashtable وهو متحسس للثقافة لأنه يستخدم المُنشئات الافتراضية لـ CaseInsensitiveHashCodeProvider و CaseInsensitiveComparer.
internalHashtable = New Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default)
internalHashtable = new Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);
إذا كنت تريد إنشاء Hashtable غير متحسس للثقافة باستخدام الفئات: CaseInsensitiveComparer و CaseInsensitiveHashCodeProvider ، قم بتهيئة مثيلات جديدة من هذه الفئات باستخدام المُنشئات التي تقبل المعامل culture. للمعامل: culture ، قم بتحديد CultureInfo.InvariantCulture. يوضح مثال التعليمات البرمجية التالي المُنشئ لـ Hashtable غير متحسس للثقافة.
internalHashtable = New Hashtable(New
CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
(CultureInfo.InvariantCulture),
new CaseInsensitiveComparer(CultureInfo.InvariantCulture));
استخدام الأسلوب: CollectionsUtil.CreateCaseInsensitiveHashTable
الأسلوب: CollectionsUtil.CreateCaseInsensitiveHashTable هو اختصار مفيد لإنشاء مثيل جديد للفئة Hashtable التي تتجاهل حالة السلاسل. ومع ذلك، جميع التحميلات الزائدة للأسلوب: CollectionsUtil.CreateCaseInsensitiveHashTable تكون متحسسة للثقافة لأنها تستخدم الخاصية: Thread.CurrentCulture . لا يمكنك إنشاء Hashtable غير متحسس للثقافة باستخدام هذا الأسلوب. لإنشاء Hashtable غير متحسس للثقافة، قم باستخدام المنشئ: Hashtable الذي يقبل المعامل: culture. للمعامل: culture ، قم بتحديد CultureInfo.InvariantCulture. يوضح مثال التعليمات البرمجية التالي المُنشئ لـ Hashtable غير متحسس للثقافة.
internalHashtable = New Hashtable(New
CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
(CultureInfo.InvariantCulture),
new CaseInsensitiveComparer(CultureInfo.InvariantCulture));
استخدام الفئة: SortedList
يمثل SortedList مجموعة من أزواج المفتاح و القيمة التي يتم فرزها بواسطة المفاتيح و يمكن الوصول إليها عن طريق المفتاح و عن طريق الفهرس. عند استخدام SortedList، حيث تكون السلاسل هي المفاتيح ، يمكن أن يتأثر الفرز و البحث بالخاصية: Thread.CurrentCulture . للحصول على سلوك غير متحسس للثقافة من SortedList ، قم بإنشاء SortedList باستخدام أحد المُنشئات التي تقبل المعامل: comparer . يحدد المعامل comparer التنفيذ IComparer لاستخدامه عند مقارنة المفاتيح. للمعامل ، قم بتعيين فئة مقارن مخصصة، تستخدم CultureInfo.InvariantCulture لمقارنة المفاتيح. يوضح المثال التالي فئة مقارن مخصصة غير متحسسة للثقافة، يمكنك تحديدها كمعامل comparer إلى منشئ: SortedList .
Imports System
Imports System.Collections
Imports System.Globalization
Friend Class InvariantComparer
Implements IComparer
Private m_compareInfo As CompareInfo
Friend Shared [Default] As New InvariantComparer()
Friend Sub New()
m_compareInfo = CultureInfo.InvariantCulture.CompareInfo
End Sub
Public Function Compare(a As Object, b As Object) As Integer _
Implements IComparer.Compare
Dim sa As String = CType(a, String)
Dim sb As String = CType(b, String)
If Not (sa Is Nothing) And Not (sb Is Nothing) Then
Return m_compareInfo.Compare(sa, sb)
Else
Return Comparer.Default.Compare(a, b)
End If
End Function
End Class
using System;
using System.Collections;
using System.Globalization;
internal class InvariantComparer : IComparer
{
private CompareInfo m_compareInfo;
internal static readonly InvariantComparer Default = new
InvariantComparer();
internal InvariantComparer()
{
m_compareInfo = CultureInfo.InvariantCulture.CompareInfo;
}
public int Compare(Object a, Object b)
{
String sa = a as String;
String sb = b as String;
if (sa != null && sb != null)
return m_compareInfo.Compare(sa, sb);
else
return Comparer.Default.Compare(a,b);
}
}
بشكل عام في حالة استخدام SortedList على سلاسل دون تعيين مقارن مخصص ثابت, يمكن لتغيير Thread.CurrentCulture بعد تعبئة القائمة أن يبطل القائمة.
استخدام الأسلوب: ArrayList.Sort
تقوم التحميلات الزائدة لأسلوب: ArrayList.Sort بتنفيذ تصنيفات متحسسة للثقافة افتراضياً باستخدام الخاصية: Thread.CurrentCulture. يمكن أن تختلف النتائج على حسب الثقافة بسبب اختلاف ترتيبات الفرز. لإزالة السلوك المتحسس للثقافة، قم باستخدام التحميلات الزائدة لهذا الأسلوب التي تقبل التنفيذ IComparer. للمعامل: comparer، قم بتحديد فئة مقارن مخصص ثابت يستخدم CultureInfo.InvariantCulture. و يوجد مثال على فئة مقارن مخصص ثابت في الموضوع: استخدام فئة SortedList.
راجع أيضًا:
المرجع
CaseInsensitiveHashCodeProvider
الأسلوب: CollectionsUtil.CreateCaseInsensitiveHashTable