مشاركة عبر


تنفيذ عمليات السلاسل الغير متحسسة للثقافة في مجموعات

يوجد فئات وأعضاء في مساحة الاسم 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.

راجع أيضًا:

المرجع

CaseInsensitiveComparer

CaseInsensitiveHashCodeProvider

الأسلوب: CollectionsUtil.CreateCaseInsensitiveHashTable

ArrayList.Sort

SortedList

Hashtable

IComparer

موارد أخرى

تنفيذ عمليات سلاسل غير متحسسة للثقافة