Megosztás a következőn keresztül:


Kultúraérzékeny sztringműveletek végrehajtása gyűjteményekben

A névtérben System.Collections vannak olyan osztályok és tagok, amelyek alapértelmezés szerint kulturális szempontból érzékeny viselkedést biztosítanak. Az és CaseInsensitiveHashCodeProvider az CaseInsensitiveComparer osztályok paraméter nélküli konstruktorai inicializálnak egy új példányt a Thread.CurrentCulture tulajdonság használatával. A metódus minden túlterhelése CollectionsUtil.CreateCaseInsensitiveHashtable alapértelmezés szerint létrehoz egy új osztálypéldányt a Thread.CurrentCultureHashtable tulajdonság használatával. A metódus túlterhelései ArrayList.Sort alapértelmezés szerint kulturális szempontból érzékeny rendezéseket végeznek a használatával Thread.CurrentCulture. A rendezést és a keresést SortedList befolyásolhatja Thread.CurrentCulture a sztringek kulcsként való használata. Kövesse az ebben a szakaszban található használati javaslatokat, hogy a névtérben található osztályok és metódusok Collections kulturális szempontból nem érzéketlen eredményeket szerezzenek.

Feljegyzés

Az összehasonlítási módszernek való CultureInfo.InvariantCulture továbbítás nem végez kulturális érzéketlen összehasonlítást. Ez azonban nem okoz nem nyelvi összehasonlítást, például fájlelérési utak, beállításkulcsok és környezeti változók esetében. Az összehasonlítási eredmény alapján hozott biztonsági döntéseket sem támogatja. A nem nyelvi összehasonlításhoz vagy az eredményalapú biztonsági döntések támogatásához az alkalmazásnak olyan összehasonlító módszert kell használnia, amely elfogadja az StringComparison értéket. Az alkalmazásnak ezután át kell adnia StringComparison.

Az és CaseInsensitiveHashCodeProvider az CaseInsensitiveComparer osztályok használata

Az osztály új példányának paraméter nélküli konstruktorai CaseInsensitiveHashCodeProvider és CaseInsensitiveComparer inicializálása a Thread.CurrentCulturekultúrkultúra szempontjából érzékeny viselkedést eredményez. Az alábbi példakód egy kulturális szempontból érzékeny konstruktor konstruktorát Hashtable mutatja be, mert a paraméter nélküli konstruktorokat használja az és CaseInsensitiveComparera CaseInsensitiveHashCodeProvider .

internalHashtable = New Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default)
internalHashtable = new Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);

Ha kulturális érzéketlent Hashtable szeretne létrehozni az és CaseInsensitiveHashCodeProvider az CaseInsensitiveComparer osztályok használatával, inicializálja ezeknek az osztályoknak az új példányait a paramétereket elfogadó culture konstruktorokkal. A paraméterhez adja meg a culture következőt CultureInfo.InvariantCulture: . Az alábbi példakód egy kultúraérzékeny Hashtablekonstruktorát mutatja be.

internalHashtable = New Hashtable(New
    CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
    New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
    (CultureInfo.InvariantCulture),
    new CaseInsensitiveComparer(CultureInfo.InvariantCulture));

CollectionsUtil.CreateCaseInsensitiveHashTable A metódus használata

A CollectionsUtil.CreateCaseInsensitiveHashTable metódus hasznos parancsikon az osztály új példányának Hashtable létrehozásához, amely figyelmen kívül hagyja a sztringek esetét. A metódus minden túlterhelése CollectionsUtil.CreateCaseInsensitiveHashTable azonban kulturális szempontból érzékeny, mert a tulajdonságot Thread.CurrentCulture használják. Ezzel a módszerrel nem hozhat létre kultúraérzékenyet Hashtable . Kultúraérzékenység Hashtablelétrehozásához használja a Hashtable paramétert elfogadó konstruktort culture . A paraméterhez adja meg a culture következőt CultureInfo.InvariantCulture: . Az alábbi példakód egy kultúraérzékeny Hashtablekonstruktorát mutatja be.

internalHashtable = New Hashtable(New
    CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
    New CaseInsensitiveComparer(CultureInfo.InvariantCulture))
internalHashtable = new Hashtable(new CaseInsensitiveHashCodeProvider
    (CultureInfo.InvariantCulture),
    new CaseInsensitiveComparer(CultureInfo.InvariantCulture));

Az SortedList osztály használata

Az A SortedList kulcs- és értékpárok gyűjteményét jelöli, amelyek a kulcsok szerint vannak rendezve, és kulcs és index alapján érhetők el. Ha sztringeket SortedList használ a kulcsok között, a rendezést és a keresést befolyásolhatja a Thread.CurrentCulture tulajdonság. Ha kultúraérzékeny viselkedést szeretne lekötni egy SortedListadott konstruktorból, hozzon létre egy SortedList paramétert elfogadó konstruktort comparer . A comparer paraméter meghatározza a IComparer kulcsok összehasonlítása során használni kívánt implementációt. A paraméterhez adjon meg egy egyéni összehasonlító osztályt, amely a kulcsok összehasonlítására használható CultureInfo.InvariantCulture . Az alábbi példa egy egyéni kultúra-érzéketlen összehasonlító osztályt mutat be, amelyet paraméterként adhat meg egy comparerSortedList konstruktor számára.

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 _compareInfo;
    internal static readonly InvariantComparer Default = new
        InvariantComparer();

    internal InvariantComparer()
    {
        _compareInfo = CultureInfo.InvariantCulture.CompareInfo;
    }

    public int Compare(Object a, Object b)
    {
        if (a is string sa && b is string sb)
            return _compareInfo.Compare(sa, sb);
        else
            return Comparer.Default.Compare(a,b);
    }
}

Általánosságban elmondható, hogy ha egyéni invariáns összehasonlító megadása nélkül használ SortedList sztringeket, a lista feltöltése utáni módosítás Thread.CurrentCulture érvénytelenítheti a listát.

ArrayList.Sort A metódus használata

A metódus túlterhelései ArrayList.Sort alapértelmezés szerint kulturális szempontból érzékeny rendezéseket hajtanak végre a Thread.CurrentCulture tulajdonság használatával. Az eredmények kultúránként eltérőek lehetnek a különböző rendezési sorrendek miatt. A kultúraérzékeny viselkedés megszüntetéséhez használja ennek a metódusnak a túlterheléseit, amelyek implementációt IComparer fogadnak el. comparer A paraméterhez adjon meg egy egyéni invariáns összehasonlító osztályt, amely a függvényt használjaCultureInfo.InvariantCulture. Az egyéni invariáns összehasonlító osztályra a Rendezéslista osztály témakör nyújt példát.

Lásd még