Delen via


Cultuurgevoelige tekenreeksbewerkingen uitvoeren in verzamelingen

Er zijn klassen en leden in de System.Collections naamruimte die standaard cultuurgevoelig gedrag bieden. De parameterloze constructors voor de CaseInsensitiveComparer en CaseInsensitiveHashCodeProvider klassen initialiseren een nieuw exemplaar met behulp van de Thread.CurrentCulture eigenschap. Alle overbelastingen van de CollectionsUtil.CreateCaseInsensitiveHashtable methode maken standaard een nieuw exemplaar van de Hashtable klasse met behulp van de Thread.CurrentCulture eigenschap. Overbelastingen van de ArrayList.Sort methode voeren standaard cultuurgevoelige sorteringen uit met behulp van Thread.CurrentCulture. Sorteren en opzoeken in een SortedList bestand kan worden beïnvloed door Thread.CurrentCulture tekenreeksen die als sleutels worden gebruikt. Volg de gebruiksaanbevelingen in deze sectie om cultuurgevoelige resultaten te verkrijgen van deze klassen en methoden in de Collections naamruimte.

Notitie

Als u een vergelijkingsmethode doorgeeft CultureInfo.InvariantCulture , wordt een cultuurgevoelige vergelijking uitgevoerd. Het veroorzaakt echter geen niet-taalkundige vergelijking, bijvoorbeeld voor bestandspaden, registersleutels en omgevingsvariabelen. Het biedt ook geen ondersteuning voor beveiligingsbeslissingen op basis van het vergelijkingsresultaat. Voor een niet-taalkundige vergelijking of ondersteuning voor beveiligingsbeslissingen op basis van resultaten moet de toepassing een vergelijkingsmethode gebruiken die een StringComparison waarde accepteert. De toepassing moet vervolgens worden doorgegeven StringComparison.

CaseInsensitiveComparer De en CaseInsensitiveHashCodeProvider klassen gebruiken

De parameterloze constructors voor CaseInsensitiveHashCodeProvider en CaseInsensitiveComparer initialiseren een nieuw exemplaar van de klasse met behulp van het Thread.CurrentCulture, wat resulteert in cultuurgevoelig gedrag. In het volgende codevoorbeeld wordt de constructor gedemonstreerd voor een Hashtable constructor die cultuurgevoelig is omdat deze gebruikmaakt van de parameterloze constructors voor CaseInsensitiveHashCodeProvider en CaseInsensitiveComparer.

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

Als u een cultuurgevoelig Hashtable wilt maken met behulp van de CaseInsensitiveComparer en CaseInsensitiveHashCodeProvider klassen, initialiseert u nieuwe exemplaren van deze klassen met behulp van de constructors die een culture parameter accepteren. Geef voor de culture parameter op CultureInfo.InvariantCulture. In het volgende codevoorbeeld ziet u de constructor voor een cultuurgevoelige 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 De methode gebruiken

De CollectionsUtil.CreateCaseInsensitiveHashTable methode is een handige snelkoppeling voor het maken van een nieuw exemplaar van de Hashtable klasse die het geval van tekenreeksen negeert. Alle overbelastingen van de CollectionsUtil.CreateCaseInsensitiveHashTable methode zijn echter cultuurgevoelig omdat ze de Thread.CurrentCulture eigenschap gebruiken. U kunt geen cultuurgevoelige Hashtable methode maken. Als u een cultuurgevoelige Hashtablewilt maken, gebruikt u de Hashtable constructor die een culture parameter accepteert. Geef voor de culture parameter op CultureInfo.InvariantCulture. In het volgende codevoorbeeld ziet u de constructor voor een cultuurgevoelige Hashtable.

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

SortedList De klasse gebruiken

A SortedList vertegenwoordigt een verzameling sleutel-en-waardeparen die zijn gesorteerd op de sleutels en die toegankelijk zijn op sleutel en index. Wanneer u een SortedList tekenreeks gebruikt waarbij tekenreeksen de sleutels zijn, kan de sorteer- en zoekactie worden beïnvloed door de Thread.CurrentCulture eigenschap. Als u cultuurgevoelig gedrag wilt verkrijgen op basis van een SortedList, maakt u een SortedList met behulp van een van de constructors die een comparer parameter accepteren. De comparer parameter geeft de IComparer implementatie op die moet worden gebruikt bij het vergelijken van sleutels. Geef voor de parameter een aangepaste vergelijkingsklasse op die wordt gebruikt CultureInfo.InvariantCulture om sleutels te vergelijken. In het volgende voorbeeld ziet u een aangepaste cultuurgevoelige vergelijkingsklasse die u kunt opgeven als parameter comparer voor een SortedList constructor.

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);
    }
}

Als u een SortedList tekenreeks gebruikt zonder een aangepaste invariantvergelijker op te geven, kan een wijziging in Thread.CurrentCulture nadat de lijst is ingevuld, de lijst ongeldig maken.

ArrayList.Sort De methode gebruiken

Overbelastingen van de ArrayList.Sort methode voeren standaard cultuurgevoelige sorteringen uit met behulp van de Thread.CurrentCulture eigenschap. De resultaten kunnen variëren per cultuur vanwege verschillende sorteervolgordes. Als u cultuurgevoelig gedrag wilt elimineren, gebruikt u de overbelastingen van deze methode die een IComparer implementatie accepteren. Geef voor de comparer parameter een aangepaste invariant-vergelijkingsklasse op die gebruikmaakt van CultureInfo.InvariantCulture. Een voorbeeld van een aangepaste invariant comparer-klasse wordt gegeven in het onderwerp Using the SortedList Class .

Zie ook